gpt4 book ai didi

c++ - 具有共同属性但不同值的派生类的正确设计设置

转载 作者:行者123 更新时间:2023-11-30 03:53:27 27 4
gpt4 key购买 nike

所以我可以想出几种方法来做到这一点,但我觉得我只是在为每个新的子类重新键入相同的内容。是否有一种设计模式可以让我为我的子类设置完整的结构,从而减少实现所需的代码量(并在可能的情况下强制执行正确的实现?)

这看起来很简单,但我的想法行不通,我发现最好的方法是在调用构造函数时在参数中进行硬编码,或者在每个子类中设置新常量然后使用它们.

我目前拥有的是这样的:

"parent.hpp"
class Parent {
private:
std::string name;
int someValue;

protected:
Parent(std::string name, int someValue); // NOTE: There will be 7 parameters/attributes that need initial base values
void setName(std::string name) { this->name = name; }
void setSomeValue(int someValue) { this->someValue = someValue; }

public:
std::string getName() { return this->name; }
int getSomeValue() { return this->someValue; }
};

"parent.cpp"
Parent::Parent(std::string name, int someValue) {
setName(name);
setSomeValue(someValue);
}

"child.hpp"
class Child : public Parent {
public:
Child();
};

"child.cpp - option 1"
static const std::string DEFAULT_NAME = "Jon";
static const int DEFAULT_SOME_VALUE = 100;

Child::Child() : Parent(DEFAULT_NAME, DEFAULT_SOME_VALUE) {
// other stuff if needed
}

"child.cpp - option 2"
Child::Child() : Parent("Jon", 100) {
// other stuff if needed
}

会有虚拟方法,我稍后会添加,但现在我只想知道拥有(可能)许多子类的正确设计模式。还有更多共同的参数,它们都是 int 值。我似乎不清楚构造函数是 Child::Child("string", 1, 2, 3, 4, 5, 6) 尽管实现新的子类会更容易。

另一方面,如果我只是为每个子类中的基值重新键入样板常量,构造函数将更具描述性,但会有很多代码重用。

在我看来,我想要做的是在子类需要定义的父类中拥有虚拟保护常量,然后从构造函数中调用它们,但这是不允许的。这两个选项中的一个更好吗?是否有更好的“长期”设置?

我查看了所有类似问题,发现最接近的问题是:Proper way to make base class setup parent class .虽然我不确定这个想法是否会解决我的问题或让任何事情变得更清楚。

我的另一个想法是从默认构造函数调用纯虚方法,但据我所知,这也是不允许的。

最佳答案

我会像 Ami 一样使用另一个对象来保持状态,尽管我会出于不同的原因这样做。由于状态是一个单独的类,您可以在构造实际的 Parent 和 Child 之前完全构造它,并且它可以有自己的层次结构。

标题

class Parent {
protected:
struct ParentState {
std::string name;
int someValue;
};

Parent(ParentState);

void setName(std::string name) { data.name = name; }
void setSomeValue(int someValue) { data.someValue = someValue; }

public:
std::string getName() { return data.name; }
int getSomeValue() { return data.someValue; }

private:
ParentState data;
};

class Child : public Parent {
struct ChildDefaults : public Parent::ParentState {
ChildDefaults();
};

public:
Child();
};

实现

Parent::Parent(ParentState init) {
// since you have setters, they should be used
// instead of just data=init;
setName(init.name);
setSomeValue(init.someValue);
}

Child::ChildDefaults::ChildDefaults(){
name = "Jon";
someValue = 100;
}

Child::Child() : Parent(ChildDefaults()){
// other stuff if needed
}

如果将 ParentState 和 ChildDefault 类放在一个单独的文件中,则可以使用该文件将所有默认值放在一个位置,以便您轻松查找或更改它们。如果它们没有隐藏在类中,强制使用额外的作用域语法,它们也可能会更漂亮。

附录:要将整个默认设置层次结构放在自己的标题中,只需将它们全部移动到一个标题中即可。请务必进行包含保护以避免多次定义构造函数。

#ifndef THE_DEFAULTS_H
#define THE_DEFAULTS_H

struct ParentState {
std::string name;
int someValue;
};

struct ChildDefaults : public Parent::ParentState {
ChildDefaults() {
name = "Jon";
someValue = 100;
}
};

// more default settings for other classes

#endif

关于c++ - 具有共同属性但不同值的派生类的正确设计设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com