C++ 具有私有构造函数和析构函数的类对象的向量?

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_;

用私有构造函数和析构函数定义类应该是这样的!作为一个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_;
    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的对象向量。但在向量中添加或删除项时,您必须处理内存。您说得对!你认为vectorVecA有帮助吗?如果是这样的话,我怎样才能用对象填充它!或者,您建议使用哪种容器代替矢量来存储对象,在这里可以使用?这些问题可能是幼稚的,但我对C++是新的!不。这需要STD::SysDyPosik是一个朋友。考虑给出一个公共构造函数和析构函数。当前,类与私有构造函数和析构函数之间存在矛盾,同时希望像使用公共构造函数和析构函数一样使用它们。编译器必须拒绝这种矛盾-因为,通过声明事物私有,您已经告诉它这样做。@Hossein std::shared_ptr也会有同样的问题-它不能使用私有成员,在这种情况下,私有成员是构造和销毁对象所必需的。不过,我编辑这个问题是为了让它起作用。@Hossein没问题,很乐意帮忙。如果上面的解决方案解决了你的问题,请通过点击分数下方的记号来接受这个答案,以便告知未来的访问者你的问题确实解决了这个问题。顺便说一句:这个答案要好得多,它没有引入非常复杂的间接过程,更不用说独特的_ptr的弹坑性能了!
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";
    }

}