【问题标题】:References and pointers in setters and getters. Need examplesetter 和 getter 中的引用和指针。需要例子
【发布时间】:2015-04-09 21:28:19
【问题描述】:

当我尝试在 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 'class JustExample' 没有名为 'someText' 的成员 D:\projects\dev-cpp test\Makefile.win [构建错误] [main.o] 错误 1

【问题讨论】:

  • "为什么我不能在声明后初始化变量?" -- 因为 C 不允许 struct 成员这样做,而 C++ 直到很久以后才添加它。甚至静态整数成员的初始化直到 C++03 才可用,并且非静态成员的大括号或初始化器列表至少需要 C++11,您的编译器可能仅部分支持。
  • 这样做不行吗? JustExample&amp; /* &lt;&lt; ADDED THERE */ getExmp() { return exmp; } ?
  • 我假设这些错误消息来自您未显示的代码,其中 string someText = "blablabla"; 作为类成员?
  • 你真的应该发布两个单独的问题,因为 JustExample 的问题与 Config 的 getter/setter 的问题完全不同
  • @MattMcNabb:是的,你可能是对的,但使用 Visual Studio 对我来说是一种痛苦,尤其是因为我刚刚开始使用 C++。我在 Dev C++ 中编写了这个快速的 sn-p,只是为了快速演示是什么让我有点头疼,并遇到了一个让我有点失望的初始化问题。 ~谢谢

标签: c++ oop c++11 getter-setter return-by-reference


【解决方案1】:

您的 getter 和 setter 代码是正确的,但是您忘记了 #include &lt;string&gt;。无需进行其他更改。

第二个问题。您需要使用 C++11 进行字符串的内联初始化;但在 C++03 中你应该使用构造函数初始化列表:

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

【讨论】:

    【解决方案2】:

    您提供的代码在 mac OS X 上使用 clang 编译,没有错误。但是我看不到你在哪里返回引用或指针,在 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;
    };
    

    指针返回类似,只是将 & 替换为 *,虽然在这种情况下返回引用可能会更好。

    【讨论】:

    • 对于你的额外问题,你不能在旧的 c++ 标准(pre c++11)中初始化非静态成员内联,你可以在你的编译器中打开 c++,-std=c++ 11 如果您使用 gcc,或者按照 Matt McNabb 的建议进行操作。
    • @swang:编译器会自动猜测我希望它在修改方法原型后返回引用或指针?我不必声明我以任何“特殊”方式返回的变量或与方法体混淆?
    • 你必须将方法实现(方法体)与原型相匹配,上面的答案只是没有打扰方法体
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多