我知道向量的大小,这是初始化它的最佳程序?:
选项1
vector<int> vec(3); //in .h
vec.at(0)=var1; //in .cpp
vec.at(1)=var2; //in .cpp
vec.at(2)=var3; //in .cpp
Run Code Online (Sandbox Code Playgroud)
选项2
vector<int> vec; //in .h
vec.reserve(3); //in .cpp
vec.push_back(var1); //in .cpp
vec.push_back(var2); //in .cpp
vec.push_back(var3); //in .cpp
Run Code Online (Sandbox Code Playgroud)
我猜选项2优于1.是吗?其他选择?
我有一个指向用户插入的派生对象的指针向量(所以我猜正确的术语是"只在运行时知道)::
vector<Person *> vect;
Run Code Online (Sandbox Code Playgroud)
派生类是男性和女性.我想对向量进行迭代,只选择Female对象并调用它的copyconstructor.我想3个解决方案:
在多种派生类的情况下,我不喜欢第一个选项.我也不喜欢第三个选项,因为会导致关系问题(世界知道每个女性,但女性不能知道世界).所以我应该使用第二个选项:示例
typeid(vect.at(i))==typeid(Female)
Run Code Online (Sandbox Code Playgroud)
这个表达是否正确?有没有其他方法来概述问题?
我通常使用纯虚函数来处理我的代码所需的那些方法.因此,我创建接口,然后其他用户实现其派生类.派生类只将这些虚函数作为公共函数,而一些其他方法应该作为私有实现,因为我的代码不会调用它们.我不知道这是否可以被认为是OOP的一个好习惯(有没有设计模式?).无论如何,我的问题是:用户可以重载纯虚函数吗?
即
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
};
class Derived:
public Base
{
private:
// methods
public:
Derived();
virtual ~Derived();
virtual void foo(int, double, double); //this doesn't work
};
Run Code Online (Sandbox Code Playgroud)
解决方案可能是:
virtual void foo(int,double,double=0)=0;
Run Code Online (Sandbox Code Playgroud)
在基类但它是非常有限的.你有什么想法?
我有A级和B级的组合关系,
class A
{
A(); //default constructor //EDIT
A(const A &mA); // copy constructor //EDIT
virtual ~A();
};
class B
{
B(A *pA); //constructor
B(const B &mB) //copy constructor
virtual ~B(); //EDIT: destructor to eliminate mA and to build the composition
A* mA;
};
Run Code Online (Sandbox Code Playgroud)
我可以用这种方式编写复制构造函数:
B(const B &mB, A *pA)
Run Code Online (Sandbox Code Playgroud)
我需要它来保持复制对象之间的组合.这是错的吗?它是否存在更好的解决方案?谢谢
编辑:我会试着更好地解释我.我想要一个对象mB和对象mA的副本.但是如果在复制构造函数中我写了mA = mB.mA,我会将地址复制到原始对象mA.所以我认为我需要一个深拷贝而不是燕子拷贝.我的困惑是因为现在,从主要的,我首先复制对象mA然后我复制mB.这样做,我想我需要使用外部函数分配复制的对象mA
foo(A *pA)
Run Code Online (Sandbox Code Playgroud)
否则,如果我可以执行mB的深层复制,我可以解决问题.这被称为深拷贝吗?
PS A和B是抽象类