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好吧,对于我的项目,它做得很好,所以我就不做了