Ссылки и указатели в установщиках и получателях. Нужен пример

Я получал ошибки весь день, когда пытался использовать ссылку или указатель возврата в 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

0

Решение

Код, который вы предоставляете, компилируется с помощью 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;
};

возврат по указателю аналогичен, просто замените & с *, хотя в этом случае лучше вернуть ссылку.

3

Другие решения

Ваш код для получения и установки правильный, но вы забыли #include <string>, Никаких других изменений не требуется.

Для второго вопроса. Вам нужно использовать C ++ 11, чтобы получить встроенную инициализацию строки; но в C ++ 03 вы должны использовать список инициализатора конструктора:

JustExample():  someText("blablabla")
{
}
1

По вопросам рекламы [email protected]