小编Ale*_*Ale的帖子

矢量:初始化还是保留?

我知道向量的大小,这是初始化它的最佳程序?:

选项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.是吗?其他选择?

c++ vector

48
推荐指数
5
解决办法
3万
查看次数

使用typeid在派生类之间进行比较

我有一个指向用户插入的派生对象的指针向量(所以我猜正确的术语是"只在运行时知道)::

vector<Person *> vect;
Run Code Online (Sandbox Code Playgroud)

派生类是男性和女性.我想对向量进行迭代,只选择Female对象并调用它的copyconstructor.我想3个解决方案:

  1. 使用旗帜;
  2. 使用typeid
  3. 要在Female的默认构造函数中插入对复制构造函数的调用,因此每次用户创建一个时,都会自动创建twin.

在多种派生类的情况下,我不喜欢第一个选项.我也不喜欢第三个选项,因为会导致关系问题(世界知道每个女性,但女性不能知道世界).所以我应该使用第二个选项:示例

typeid(vect.at(i))==typeid(Female)
Run Code Online (Sandbox Code Playgroud)

这个表达是否正确?有没有其他方法来概述问题?

c++ types

6
推荐指数
1
解决办法
7967
查看次数

纯虚函数重载

我通常使用纯虚函数来处理我的代码所需的那些方法.因此,我创建接口,然后其他用户实现其派生类.派生类只将这些虚函数作为公共函数,而一些其他方法应该作为私有实现,因为我的代码不会调用它们.我不知道这是否可以被认为是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)

在基类但它是非常有限的.你有什么想法?

c++ oop design-patterns overloading pure-virtual

6
推荐指数
1
解决办法
2万
查看次数

复制构造函数和组合

我有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是抽象类

c++ copy-constructor

2
推荐指数
1
解决办法
926
查看次数