代码之家  ›  专栏  ›  技术社区  ›  Alexandru Barbarosie

如何初始化对在单独文件中声明的类的引用?

  •  0
  • Alexandru Barbarosie  · 技术社区  · 10 年前
    class Foo{
        void operator=(const Foo&){};   
    public:
        Foo(){};
    };
    
    Foo& fooRef(){
        static Foo aFoo;
        return aFoo;
    }
    int main() {
        Foo &foo = fooRef();
        return 0;
    }
    

    此代码正常工作,不会发出任何错误。一旦我将主体更改为:

    int main(){
        Foo &foo; 
        foo = fooRef();
        return 0;
    }
    

    编译器尝试使用 operator= 并因此抱怨。所以我的第一个问题是:为什么会有不同?

    我了解这一事实的方式是,我正在使用 CPPunit 在那里我必须测试一个签名为 getInstance() 存在 Singleton& getInstance() 。为了进行测试,我正在尝试在 TestSingleton 班因此,具有:

    class TestSingleton{
    ...
    private:
        Singleton &instance;
    };
    
    
    void TestSingleton::setUp(){
        this->instance = Singleton::getInstance();
    }
    

    上面的示例会发出错误(如 操作员= 被声明为私有,如果不是,很明显我不愿意调用它)。所以第二个问题是:我如何避免这种情况,并在我的 测试Singleton

    1 回复  |  直到 10 年前
        1
  •  5
  •   juanchopanza    10 年前

    引用既不能默认初始化,也不能重新定位。它们必须从一开始就引用现有对象。它们只是另一个对象的别名。

    所以第二个问题是:我如何避免这种情况,并在我的 TestSingleton

    可以使用构造函数初始化列表初始化引用成员:

    class TestSingleton{
    ...
      TestSingleton(Singleton& s) : instance(s) {}
    private:
        Singleton &instance;
    };
    

    如果您发现需要能够默认初始化,然后重新设置“引用”,则应改用指针或可选类型(请参见 boost::optional 例如)。但在这种特殊情况下,由于您处理的是单例,因此实际上不需要存储对它的引用 Singleton::getInstance() 只要你需要。