ROOT 类的 C++ 赋值运算符

标签 c++ inheritance assignment-operator root-framework

我正在使用 ROOT frameowrk,我想写一个类,它有一个 TMultiGraph 成员。我正在尝试为我的类(class)编写和赋值运算符,但由于编译问题我失败了。 TMultiGraph 类将其赋值运算符保持为 protected

我类(class)的标题:

#include "../include/clipper.hpp"
#include "TMultiGraph.h"
#include "TColor.h"
#include "RtypesCore.h"

using namespace ClipperLib;

class ClipperDraw : protected TMultiGraph {

public:
    ClipperDraw() {}

    ClipperDraw& operator=(const ClipperDraw &c);

private:
    TMultiGraph mg;

};

.cpp 是:

ClipperDraw& ClipperDraw::operator=(const ClipperDraw &c)
{
    mg = c.mg;
    return *this;
}

编译时我收到这条消息:

g++ -fPIC -Wall `root-config --cflags` -I./include -O2  -c -o obj/ClipperDraw.o src/ClipperDraw.cpp
In file included from src/../include/ClipperDraw.h:12:0,
                 from src/ClipperDraw.cpp:8:
/home/user/anaconda3/envs/deepjetLinux3/include/TMultiGraph.h: In member function ‘ClipperDraw& ClipperDraw::operator=(const ClipperDraw&)’:
/home/user/anaconda3/envs/deepjetLinux3/include/TMultiGraph.h:47:17: error: ‘TMultiGraph& TMultiGraph::operator=(const TMultiGraph&)’ is protected
    TMultiGraph& operator=(const TMultiGraph&);
                 ^
src/ClipperDraw.cpp:26:5: error: within this context
  mg = c.mg;
     ^
Makefile:19: recipe for target 'obj/ClipperDraw.o' failed
make: *** [obj/ClipperDraw.o] Error 1

最佳答案

TMultiGraph 的复制构造函数和复制赋值运算符都被标记为 protected 。这意味着您不能将一个 TMultiGraph 分配给另一个 TMultiGraph。继承不会帮助您,因为它不会改变这一事实。

TMultiGraph 继承的是允许创建您自己的可以复制的图形类。看起来像

class MyMultiGraph : public TMultiGraph {
    //...
public:
    MyMultiGraph& operator =(const MyMultiGraph& rhs)
    {
        TMultiGraph::operator=(rhs);
        // assign MyMultiGraph member here
    }
};

关于ROOT 类的 C++ 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46054527/

相关文章:

c# - 输入保存受约束泛型类实例的变量

java - 继承 JPA 和 Hibernate 问题

C++ 双释放或损坏(出): Even with copy constructor and assignment operator

java - 对象 o = makeMeAnObjectPlease(); 之间的区别和 Object o = new Object();

c++ - 是否可以在 C/C++ 中声明全局二维数组?

c++ - 在 GCC 和 OS X 中使用 SFML 时遇到问题

c++ - 遍历字符串时尝试访问子字符串的编译器错误

c++ - 重用线程 - boost 与标准线程行为

c++ - 装饰器模式在 C++ 内部是如何工作的?

c++ - 左值和右值分配错误