ROOT 类的 C++ 赋值运算符

C++ assignment operator for ROOT class

提问人:proton 提问时间:9/5/2017 最后编辑:proton 更新时间:9/5/2017 访问量:138

问:

我正在使用 ROOT frameowrk,我想编写一个具有成员的类。我正在尝试为我的类编写和分配运算符,但由于编译问题而失败。该类将其赋值运算符保留为 。TMultiGraphTMultiGraphprotected

我的班级的标题:

#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
C++ 继承赋 值运算符 根框架

评论

1赞 CinCout 9/5/2017
所以你继承了 ,并把它保留为成员变量TMultiGraph
0赞 proton 9/5/2017
@i,使运算符编译可能会有所帮助
0赞 CinCout 9/5/2017
嗯,它没有。
0赞 proton 9/5/2017
@CinCout有什么作用呢?
0赞 463035818_is_not_an_ai 9/5/2017
如果没有公共赋值运算符,那么要么是因为它无法赋值,要么是因为它的设计不好(在根:P中不会是一个很大的惊喜),在第一种情况下......好吧,如果不能将其分配给,那么您最好不要绕过该限制TMultiGraph

答:

1赞 NathanOliver 9/5/2017 #1

的复制构造函数和复制赋值运算符都标记为受保护。这意味着您不能将 a 分配给另一个 .继承对你没有帮助,因为它不会改变这个事实。TMultiGraphTMultiGraphTMultiGraph

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

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

评论

0赞 proton 9/5/2017
你的意思是你甚至不能写这样的东西?TMultiGrpah m,n; m=n;
0赞 NathanOliver 9/5/2017
@proton没错。由于它们被标记为受保护,因此只有从它派生的朋友或类才能访问函数。
0赞 proton 9/5/2017
所以在我的代码中,我应该写 - ?如何更改我写的运算符?mg = TMultiGraph::operator=(rhs.mg);
0赞 NathanOliver 9/5/2017
@proton 编号那行不通。您无法复制 .您的选择是从它派生的,并提供所需的功能,或者存储指针并复制指针。不过,执行后者意味着所有副本共享相同的图形。TMultiGraph
1赞 NathanOliver 9/5/2017
@proton 它允许您创建一个具有功能但允许您复制它的类。这不是一个很好的解决方案,因为你必须为每个函数编写一个函数,并且在这些函数中,你必须调用相应的函数。TMultiGraphTMultiGraphTMultiGraph