C++ 具有私有构造函数和析构函数的类对象的向量?
用私有构造函数和析构函数定义类应该是这样的!作为一个friend类,我如何在B中创建a对象的向量,并用函数addA填充它。我得到了错误C2248:A::~A:无法访问在A类中声明的私有成员C++ 具有私有构造函数和析构函数的类对象的向量?,c++,private-members,C++,Private Members,用私有构造函数和析构函数定义类应该是这样的!作为一个friend类,我如何在B中创建a对象的向量,并用函数addA填充它。我得到了错误C2248:A::~A:无法访问在A类中声明的私有成员 class A { private: A(); A(const std::string& name, const float& num); ~A(); public: friend class B; private: std::string name_;
class A
{
private:
A();
A(const std::string& name, const float& num);
~A();
public:
friend class B;
private:
std::string name_;
float num_;
};
A::A()
{
name_ = "NoName";
num_ = 0.0;
}
A::A(const std::string& name, const float& num)
{
name_ = name;
num_ = num;
}
A::~A()
{
}
class B
{
public:
B();
~B();
void addA(const std::string name, const float num);
private:
vector<A> vecA;
};
B::B()
{
}
B::~B()
{
}
void B::addA(const std::string name, const float num)
{
A a(name, num);
vecA.push_back(a);
}
int main()
{
B b;
b.addA("Name", 1.0);
return 0;
}
如何在B[…]中创建对象的向量
你不能那样做。虽然B是a的朋友,但std::vector不是a的朋友,这意味着它不能访问a的私有成员,例如构造函数,这是向量工作所必需的
但是,如果您对一点间接操作、一点潜在的性能影响和签名的更改没有意见,那么您可以用一个工作的std::vector替换不工作的std::vector
需要注意的是,普通std::unique_ptr在这里不起作用。它与std::vector有一个类似的问题-它无法访问a的私有析构函数。解决这个问题的一种方法是将As的构造和销毁工作完全外包给B-通过显式构造和销毁,即:
新阿纳姆
静态void deleter_aA*a{delete a;}
在B的范围内
现在我们可以做:
std::vector<std::unique_ptr<A, std::function<void(A*)>>> vecA;
虽然@Fureeish有一个简洁的解决方案,但这里有一个稍微简单的替代方案:只需包装它
class AccessPrivate;
class PrivStuff
{
private:
PrivStuff() {}
~PrivStuff() {}
public:
friend class AccessPrivate;
std::string m_data{};
};
class AccessPrivate
{
public:
AccessPrivate() = default;
~AccessPrivate() = default;
PrivStuff m_priv;
};
int main(int argc, char* argv[])
{
std::vector<AccessPrivate> myvec;
myvec.resize(4);
for (auto& stuff : myvec)
{
stuff.m_priv.m_data = "heya";
}
}
如果您需要更复杂的东西,比如传入参数,只需向AccessPrivate添加一个等价的构造函数就可以了。本质上,您可以像对待实际的私有类一样对待AccessPrivate,只是一个间接层次。只是出于好奇;为什么你想要一个私有析构函数?为什么你的构造函数和析构函数都是私有的?虽然B是a的朋友,但std::vector不是a的朋友,因此无法访问A的私有成员。例如,由于对存储的对象的内部生命周期处理,它需要析构函数。@更清楚,我相信您可以创建指向A的指针向量,而不是指向A的对象向量。但在向量中添加或删除项时,您必须处理内存。您说得对!你认为vector
class AccessPrivate;
class PrivStuff
{
private:
PrivStuff() {}
~PrivStuff() {}
public:
friend class AccessPrivate;
std::string m_data{};
};
class AccessPrivate
{
public:
AccessPrivate() = default;
~AccessPrivate() = default;
PrivStuff m_priv;
};
int main(int argc, char* argv[])
{
std::vector<AccessPrivate> myvec;
myvec.resize(4);
for (auto& stuff : myvec)
{
stuff.m_priv.m_data = "heya";
}
}