D
Docker
возможно кому-то покажется что я задаю тупой вопрос... но помогите разобраться с проблемой нормально, а не так, как это сделал я
Суть вопроса такова, ниже приведен код:
// strngbad.h -- flawed string class definition
// strngbad.cpp -- StringBad class methods
// vegnews.cpp -- using new and delete with classes
// compile with strngbad.cpp
ВОПРОС: почему при компиляции данного кода (Microsoft Visual Studio 6.0) возникает ошибка error C2248: 'str' : cannot access private member declared in class 'StringBad' ?
Ведь дружественные конструкции могут обращаться к скрытым членам класса.
p.S. сам то я режил проблему заменой строк
#include <iostream>
using namespace std;
на строку
#include <iostream.h>
По-моему это смешное решение вопроса, и мне не дает покоя тот факт, что я не понимаю в чем моя ошибка в вышеуказанном коде. Спасибо за внимание и надеюсь ответы.
Суть вопроса такова, ниже приведен код:
// strngbad.h -- flawed string class definition
Код:
#include <iostream>
using namespace std;
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
char * str; // pointer to string
int len; // length of string
static int num_strings; // number of objects
public:
StringBad(const char * s); // constructor
StringBad(); // default constructor
~StringBad(); // destructor
// friend function
friend ostream & operator<<(ostream & os, const StringBad & st);
};
#endif
// strngbad.cpp -- StringBad class methods
Код:
#include <iostream>
#include <cstring> // string.h for some
#include "strngbad.h"
using namespace std;
// initializing static class member
int StringBad::num_strings = 0;
// class methods
StringBad::StringBad(const char * s) // construct StringBad from C string
{
len = strlen(s); // set size
str = new char[len + 1]; // allot storage
strcpy(str, s); // initialize pointer
num_strings++; // set object count
cout << num_strings << ": \"" << str
<< "\" object created\n"; // For Your Information
}
StringBad::StringBad() // default constructor
{
len = 4;
str = new char[4];
strcpy(str, "C++"); // default string
num_strings++;
cout << num_strings << ": \"" << str
<< "\" default object created\n"; // FYI
}
StringBad::~StringBad() // necessary destructor
{
cout << "\"" << str << "\" object deleted, "; // FYI
--num_strings; // required
cout << num_strings << " left\n"; // FYI
delete [] str; // required
}
ostream & operator<<(ostream & os, const StringBad & st)
{
os << st.str;
return os;
}
// vegnews.cpp -- using new and delete with classes
// compile with strngbad.cpp
Код:
#include <iostream>
using namespace std;
#include "strngbad.h"
void callme1(StringBad &); // pass by reference
void callme2(StringBad); // pass by value
int main()
{
StringBad headline1("Celery Stalks at Midnight");
StringBad headline2("Lettuce Prey");
StringBad sports("Spinach Leaves Bowl for Dollars");
cout << "headline1: " << headline1 << endl;
cout << "headline2: " << headline2 << endl;
cout << "sports: " << sports << endl;
callme1(headline1);
cout << "headline1: " << headline1 << endl;
callme2(headline2);
cout << "headline2: " << headline2 << endl;
cout << "Initialize one object to another:\n";
StringBad sailor = sports;
cout << "sailor: " << sailor << endl;
cout << "Assign one object to another:\n";
StringBad knot;
knot = headline1;
cout << "knot: " << knot << endl;
cout << "End of main()\n";
return 0;
}
void callme1(StringBad & rsb)
{
cout << "String passed by reference:\n";
cout << " \"" << rsb << "\"\n";
}
void callme2(StringBad sb)
{
cout << "String passed by value:\n";
cout << " \"" << sb << "\"\n";
}
ВОПРОС: почему при компиляции данного кода (Microsoft Visual Studio 6.0) возникает ошибка error C2248: 'str' : cannot access private member declared in class 'StringBad' ?
Ведь дружественные конструкции могут обращаться к скрытым членам класса.
p.S. сам то я режил проблему заменой строк
#include <iostream>
using namespace std;
на строку
#include <iostream.h>
По-моему это смешное решение вопроса, и мне не дает покоя тот факт, что я не понимаю в чем моя ошибка в вышеуказанном коде. Спасибо за внимание и надеюсь ответы.