我正在上C ++课程,很不幸,我们正在学习过时的C ++。这个问题很具体,我不能只用谷歌搜索。感谢您的回答。

我/如何从派生的ctor初始化列表访问基本私有文件?我/如何从派生的ctor执行块调用函数?



class Point {
    const double x;
    const double y;
public:
    Point () = delete;
    Point ( Point && other ) : x { other.x }, y { other.y } {}
    explicit Point ( double xx, double yy) : x { xx }, y { yy }, {}


城市

class City : public Point {
    const std::string name;
public:
    City () = delete;
    City ( City && other )
      : Point ( std::forward < City > ( other ) ) { name = other.name; }
    // is other scrapped by the time I try to get the name?
    explicit City ( double xx, double yy, std::string nname )
      : Point ( xx, yy ) { name = nname; }


explicit ctor为便于参考;这是我唯一的显式ctor)

City's explicit ctorCity's move ctor中,我得到相同的错误:没有找到operator=重载。与string::assign以及其他所有字符串方法同上。这是怎么回事?包含string

如果我将protected:放在Point's私有前面,然后尝试在explicit City ctor初始化列表x { xx }, .. name { nname } {}中对其进行初始化,则错误表明x不是成员或基类

最佳答案

问题在于,如果std::string name标记为const,则您无法为其分配,因为std::basic_string<>::operator=当然是非常量的。只需在构造器列表初始化中将其初始化,例如name {other.name}

下面是一个示例:

#include <iostream>

class Point {
    const double x;
    const double y;
public:
    Point () = delete;
    Point ( Point && other ) : x { other.x }, y { other.y } {}
    explicit Point ( double xx, double yy) : x { xx }, y { yy } {}
};
class City : public Point {
    const std::string name;
public:
    City () = delete;
    City ( City && other )
        : Point ( std::forward < City > ( other ) ) , name {other.name}{}


    // is other scrapped by the time I try to get the name?
    explicit City ( double xx, double yy, std::string nname )
        : Point ( xx, yy ), name{nname}{}
};

int main()
{
}

关于c++ - 派生类中基类委派的ctor的c++使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32899263/

10-12 02:37