【问题标题】:Basic C++ question about constructors of two classes that are very similar关于两个非常相似的类的构造函数的基本 C++ 问题
【发布时间】:2021-07-16 05:16:56
【问题描述】:

这是一个关于 C++ 构造函数的相对简单的问题。假设我有一个 A 类,表示速度矢量的 3D 集合(由于某些原因,它也是一个类)。我的 A 类由以下定义(我去掉了方法):

class A {
public:
A(int Nx, int Ny, int Nz, double lambda) 
: field(Nx, vector<vector<Velocity>>(Ny, vector<Velocity>(Nz))), Nx(Nx), Ny(Ny), Nz(Nz), lambda(lambda)
{}

private:
vector<vector<vector<Velocity>>> field;
double Nx;
double Ny;
double Nz;
double lambda;
}; 

现在假设我有一个 B 类,它也是一个 3D 集合,但这次是力向量,我们想创建一个构造函数,接收 field 作为参数并将其“3D 矩阵”初始化为相同的大小作为它收到的field 的。

class B {
public:
B(const A& sky) 
: space( ??? ) //How can I give space the informations that are private in A without getters methods ?
{}

private:
vector<vector<vector<Force>>> space;
double Nx;
double Ny;
double Nz;
double lambda;
}; 

我的问题如下:如果类 A 的字段已经初始化为大小为 30x30x30 和 lambda = 2,我如何将它们赋予类 B 的“空间”属性,而不创建一个方法来访问类 A 的私有属性并在类 B 的构造函数中调用它我正在苦苦挣扎要构建,该方法如下所示:

vector<double> A::getters() const {
    vector<double> bad_habit ({Nx, Ny, Nz, lambda});
    return bad_habit;
}

(由于 A 和 B 都是 3D 集合,所以我想创建一个名为 3D 集合的超类,我不知道它是否有助于解决问题,还是只会让事情变得更难)

【问题讨论】:

  • 如果它大量修改 A 并影响我没有展示的方法可能会令人不安,但是是的,为什么不呢,我会学到新的东西,继续! @cigien
  • 我读了几遍,很难理解你真正想要什么。听起来您在问如何提供对某物的访问权,同时又不提供对同一事物的访问权。您有很多想要引用/复制的集合(集合),但不想提供任何方法来这样做? AB 是不相关的类。您唯一的访问权限是您以编程方式提供的访问权限,无论是通过好友、访问者还是其他方式。
  • @WhozCraig 抱歉,如果我的问题不清楚,我是 oop 和编码的新手。如果没有细节,我会说这个问题可以概括为“如何在不创建 getter 的情况下为 B 类的对象赋予 A 类的相同属性?”
  • 作为不相关的类,选项很少。 (1) 将成员公开(yuck)。 (2)friendAB(不是那么糟糕)。 (3) 在 A 中提供一个填充符,它接受 B&amp; 并填写您所要求的内容(可能需要将 BA 交朋友,回到 yuck),最后 (4) 提供实际的公共吸气剂并保持你的成员是私人的。我强烈反对 (1) 和 (3),并建议您选择 (2) 和 (4) 两者中的较小者。

标签: c++ oop constructor attributes encapsulation


【解决方案1】:

正如 WhozCraig 在 cmets 中回答的那样:

作为不相关的类,选项很少。 (1) 将成员公开(yuck)。 (2) A 到 B 级的朋友(不是那么糟糕)。 (3) 在 A 中提供一个填充符,它接受一个 B& 并填写您所要求的内容(可能需要将 B 与 A 交朋友,然后返回 yuck),最后 (4) 提供实际的公共 getter 并使您的成员保密。

我强烈反对 (1) 和 (3),并建议您选择 (2) 和 (4) 的两个弊端中的较小者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-06-15
    • 2011-01-20
    • 2017-01-17
    相关资源
    最近更新 更多