禁用复制构造函数和赋值运算符时将引用实例传递给静态方法

Posted

技术标签:

【中文标题】禁用复制构造函数和赋值运算符时将引用实例传递给静态方法【英文标题】:Pass reference instance to static method when copy-constructor and assignment-operator is disabled 【发布时间】:2021-05-06 13:43:45 【问题描述】:

我的 ClassA 是这样的:

class ClassA

private:
    static uint32_t IDCOUNTER;
    uint32_t _id = -1;

public:
    ClassA();
    ~ClassA();
    ClassA(const ClassA&) = delete;
    void operator=(const ClassA&) = delete;
;

我想创建一个特定的 ClassA 实例,我希望它被传递,但我不希望它以任何方式被复制。所以,在我的主函数中,我实例化了 instanceA1。 接下来,(在我的 main 函数中),我想将此实例存储在全局某个地方,例如在静态类中:

int main()

    ClassA instanceA1;
    ClassStatic::SetClassA(&instanceA1);



// this class is declared in a separate file:
class ClassStatic

private:
    static ClassA *referenceToA;

public:
    static void SetClassA(ClassA* refToSingleAInstance)
    
        referenceToA = refToSingleAInstance; // taken from cpp part of the class just for this question
    
;

编译时出现链接器错误。这是为什么?我是不是把整个概念都弄错了(似乎很可能......)?我该如何解决这个问题?

【问题讨论】:

你可能想看看“单例模式”以及它通常是如何实现的...... 您在哪里定义了 IDCOUNTER?和referenceToA? @AliRazmkhah 我在 ClassA.cpp 文件中定义了它。但是我忘记用 nullptr 或 sth 初始化 referenceToA。像这样。 【参考方案1】:

编译时出现链接器错误。这是为什么呢?

因为你没有定义ClassStatic::referenceToA

我该如何解决这个问题?

在(恰好一个)翻译单元中定义ClassStatic::referenceToA

【讨论】:

我不是用:static ClassA *referenceToA; 定义的。 ? @AudioGuy 否。如果这是定义,那么您会遇到将类定义包含到多个翻译单元中的问题,因为一个定义规则不允许在多个 TU 中定义变量。 所以我应该在 cpp 文件中做 ClassStatic::referenceToA =nullptr 吗?抱歉,我是 C++ 新手 ;-) 我一回到我的电脑就会尝试。我会及时通知你。

以上是关于禁用复制构造函数和赋值运算符时将引用实例传递给静态方法的主要内容,如果未能解决你的问题,请参考以下文章

静态成员

在 C++ 中编写复制构造函数和赋值运算符的清单

c++,类的对象作为形参时一定会调用复制构造函数吗?

为啥我能够为 QObject 子类创建复制构造函数并重载赋值运算符?

c++中拷贝构造函数和赋值运算符重载本质上一样么

[QT入门篇]3 QObject的拷贝构造函数与赋值运算符