C++ 更改变量值C++;

C++ 更改变量值C++;,c++,inheritance,C++,Inheritance,我试图做的是在class a中更改class B中的变量,并使其在class C中相同 class A { protected: string name = "A"; }; class B: public A { protected: string A::name="B"; }; class C: public B { // here i want "name" to be "B" }; 但问题是,我在类C中得到一个错误“成员声明中的非法限定名”。您想要的是初始化构造函数

我试图做的是在
class a
中更改
class B
中的变量,并使其在
class C
中相同

class A
{
protected:
    string name = "A";
};

class B: public A
{
protected:
    string A::name="B";
};

class C: public B
{
 // here i want "name" to be "B"
};

但问题是,我在
类C
中得到一个错误“成员声明中的非法限定名”。

您想要的是初始化构造函数中变量的值

public class B: public A
{
public:
    B():name{"B"}{};
}

您想要的是在构造函数中初始化变量的值

public class B: public A
{
public:
    B():name{"B"}{};
}

你不能这样做。如果字段在基类中初始化,则仅在基类中初始化。在其他类中,只能更改已初始化的字段。 执行所需操作的方法之一是在构造函数中传递值。因此:

class A
{
public:
    A(std::string initName = "A") : name(std::move(initName)) {}
protected:
    string name;
};

class B: public A
{
public:
    B() : A("B") {}
};

class C: public B
{
// name will be "B" here
};

你不能这样做。如果字段在基类中初始化,则仅在基类中初始化。在其他类中,只能更改已初始化的字段。 执行所需操作的方法之一是在构造函数中传递值。因此:

class A
{
public:
    A(std::string initName = "A") : name(std::move(initName)) {}
protected:
    string name;
};

class B: public A
{
public:
    B() : A("B") {}
};

class C: public B
{
// name will be "B" here
};

如果类的名称是静态的,并且您不介意使用多态性,那么可以添加一个
virtual
成员函数来返回类的名称。只需重写派生类中的函数即可返回不同的名称

例如:

#include <iostream>
#include <memory>
#include <vector>

class A {
public:
    virtual ~A() = default;

    virtual const std::string& name() const {
        static const std::string rv = "A";
        return rv;
    }
};

class B : public A {
public:
    const std::string& name() const override {
        static const std::string rv = "B";
        return rv;
    }
};

class C: public B {
    // doesn't override name() - will be named "B"
};

int main() {
    std::vector<std::unique_ptr<A>> objs;     // Storage of base class pointers.

    objs.emplace_back(std::make_unique<A>()); // Add pointers to...
    objs.emplace_back(std::make_unique<B>()); // objects of different...
    objs.emplace_back(std::make_unique<C>()); // derived classes.

    // call the virtual member function through the base class pointer
    for(auto& uptr : objs) {
        std::cout << uptr->name() << '\n';
    }
}

如果类的名称是静态的,并且您不介意使用多态性,那么可以添加一个
virtual
成员函数来返回类的名称。只需重写派生类中的函数即可返回不同的名称

例如:

#include <iostream>
#include <memory>
#include <vector>

class A {
public:
    virtual ~A() = default;

    virtual const std::string& name() const {
        static const std::string rv = "A";
        return rv;
    }
};

class B : public A {
public:
    const std::string& name() const override {
        static const std::string rv = "B";
        return rv;
    }
};

class C: public B {
    // doesn't override name() - will be named "B"
};

int main() {
    std::vector<std::unique_ptr<A>> objs;     // Storage of base class pointers.

    objs.emplace_back(std::make_unique<A>()); // Add pointers to...
    objs.emplace_back(std::make_unique<B>()); // objects of different...
    objs.emplace_back(std::make_unique<C>()); // derived classes.

    // call the virtual member function through the base class pointer
    for(auto& uptr : objs) {
        std::cout << uptr->name() << '\n';
    }
}


你想在B类中更改A类的
名称吗?不,不,我只想在
B类中更改在
A类中声明的变量,并使该变量在
C类中以更改后的形式显示在
C类中,我只想更改
类A
中声明的变量,在
类B
中,并使该变量在
类C
@tonytannous中以更改后的形式出现。因此,如果没有构造函数,我将无法实现它?@Bartasus1是的。看到我的答案了。所以没有构造器我是不可能成功的吗?@Bartasus1是的。看到我的答案了。我知道如何由建设者来处理它,但我希望我能以不同的方式来处理它。无论如何,谢谢你的帮助help@Bartasus1不幸的是,没有构造函数就无法处理它。原因是C++中的基类字段初始化可能只在基类中发生。做同样的事情,但只是有点不同的方式。也许有人会发现它更容易阅读:<代码>(){{::name=b;}< /Cord> @ Baltasu1不,这是低效的,并且每个曾经在C++编程过一段时间的人都会立即改变它。对于不能默认构造的类,你甚至不能这样做。@TedLyngmo好吧,对于我的项目来说,它做得很好,所以我会让它知道如何由构造函数来处理它,但我希望我能以不同的方式来处理它。无论如何,谢谢你的帮助help@Bartasus1不幸的是,没有构造函数就无法处理它。原因是C++中的基类字段初始化可能只在基类中发生。做同样的事情,但只是有点不同的方式。也许有人会发现它更容易阅读:<代码>(){{::name=b;}< /Cord> @ Baltasu1不,这是低效的,并且每个曾经在C++编程过一段时间的人都会立即改变它。对于不能默认构造的类,你甚至不能这样做。@TedLyngmo好吧,对于我的项目,它做得很好,所以我就不做了