Я получал ошибки весь день, когда пытался использовать ссылку или указатель возврата в c ++. Скажите, пожалуйста, что я должен изменить в приведенном ниже коде, чтобы возвращать членов класса Config по ссылке или по указателю.
#include <cstdlib>
#include <iostream>
using namespace std;
class JustExample {
public:
string someText;
JustExample() {
someText = "blablabla";
}
};
class Config
{
public:
Config();
string getResourceDir() const;
JustExample getExmp() { return exmp; }
void setResourceDir(const string& dir);
void setExmp(JustExample example) { exmp = example; }
private:
JustExample exmp;
string res_dir;
};
Config::Config() {
res_dir = "class value";
}
string Config::getResourceDir() const { return res_dir; }
void Config::setResourceDir(const string& dir) { res_dir = dir; }
int main(int argc, char *argv[])
{
Config cfg;
cout << cfg.getResourceDir() << endl;
cfg.setResourceDir("changed");
cout << cfg.getResourceDir() << endl;
cout << cfg.getExmp().someText << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Бонусный вопрос. Почему я не могу инициализировать переменные после их объявления, но вместо этого мне нужно присвоить их значение в конструкторе класса, иначе я получаю ошибку.
8 D: \ projects \ dev-cpp test \ main.cpp ISO C ++ запрещает инициализацию элемента `someText ' 8 D: \ projects \ dev-cpp test \ main.cpp делает статический someText 8 D: \ projects \ dev-cpp test \ main.cpp недопустимая инициализация в классе статического члена данных нецелого типа `std :: string ' D: \ projects \ dev-cpp test \ main.cpp В функции `int main (int, char **) ': 38 D: \ projects \ dev-cpp test \ main.cpp У класса JustExample нет члена с именем someText D: \ projects \ dev-cpp test \ Makefile.win [Ошибка сборки] [main.o] Ошибка 1
Код, который вы предоставляете, компилируется с помощью clang на Mac OS X без ошибок. Но я не вижу, куда вы возвращаете ссылку или указатель, в Config вы можете сделать это:
class Config
{
public:
Config();
const string& getResourceDir() const;
const JustExample& getExmp() { return exmp; }
void setResourceDir(const string& dir);
void setExmp(const JustExample& example) { exmp = example; }
private:
JustExample exmp;
string res_dir;
};
возврат по указателю аналогичен, просто замените & с *, хотя в этом случае лучше вернуть ссылку.
Ваш код для получения и установки правильный, но вы забыли #include <string>
, Никаких других изменений не требуется.
Для второго вопроса. Вам нужно использовать C ++ 11, чтобы получить встроенную инициализацию строки; но в C ++ 03 вы должны использовать список инициализатора конструктора:
JustExample(): someText("blablabla")
{
}