【发布时间】: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
-
我读了几遍,很难理解你真正想要什么。听起来您在问如何提供对某物的访问权,同时又不提供对同一事物的访问权。您有很多想要引用/复制的集合(集合),但不想提供任何方法来这样做?
A和B是不相关的类。您唯一的访问权限是您以编程方式提供的访问权限,无论是通过好友、访问者还是其他方式。 -
@WhozCraig 抱歉,如果我的问题不清楚,我是 oop 和编码的新手。如果没有细节,我会说这个问题可以概括为“如何在不创建 getter 的情况下为 B 类的对象赋予 A 类的相同属性?”
-
作为不相关的类,选项很少。 (1) 将成员公开(yuck)。 (2)
friend类A到B(不是那么糟糕)。 (3) 在 A 中提供一个填充符,它接受B&并填写您所要求的内容(可能需要将B与A交朋友,回到 yuck),最后 (4) 提供实际的公共吸气剂并保持你的成员是私人的。我强烈反对 (1) 和 (3),并建议您选择 (2) 和 (4) 两者中的较小者。
标签: c++ oop constructor attributes encapsulation