-1

我可以将对象传递给向量并同时创建它吗?我将尝试通过一个例子来说明我的意思。

#include <vector>

class testObject{
private:
   int someInt;
public:
   testObject(int a){ someInt=a; }
};

int main() {
   std::vector<testObject> testVector;
   testVector.push_back(testObject(2));
}

我尝试使用类似于上面代码的东西。不出所料,实际上没有对象被添加到向量中。据我了解testObject(2),确实创建了一个实例,testObject但在构造函数完成时它超出了范围。

更新:

亲爱的助手/顾问。非常感谢您的回答。我通读了所有评论和代码示例,现在必须稍微改变我的问题。我在testObject-class 中添加了一个成员。现在,如果我将对象的一个​​实例添加到向量中(如上例所示),则该成员似乎为空。现在我想我需要分配一些内存来做到这一点?通常我会尽量避免通过分配内存,new因为我害怕内存泄漏并且对我的编程技能没有信心。什么是最明智的实施?

4

4 回答 4

2

它适用于一些小修复:

 class testObject{
 public:
       testObject(int){
       }
    };

int main()
{
  vector<testObject> testVector;
  testVector.push_back(testObject(2));
} 

这个世界已经改变了,如果可以的话,请将你的编译器升级到最新版本。我已经很多年没见过VC6.0了。

于 2013-01-18T10:54:46.427 回答
1

关于代码,billz的回答是正确的。

为了解决您的疑虑:

现在,如果我将对象的一个​​实例添加到向量中(如上例所示),则该成员似乎为空。

它应该可以正常工作 - 请说明您如何确定这一点。

现在我想我需要分配一些内存来做到这一点?

编译器应该为你生成一个默认的成员复制构造函数。如果您的成员都是值类型(如此处),这通常会导致正确的浅拷贝。

如果您想在某个地方添加日志记录或断点,您可以自己显式编写它,但您不需要:

class testObject{
private:
   int someInt;
public:
   explicit testObject(int a) : someInt(a) {}
   // compiler should automatically handle copy like this:
   testObject(testObject const &other) : someInt(other.someInt) {}
   // and handle assignment like this:
   testObject& operator=(testObject const &other) {
      someInt = other.someInt;
      return *this;
   }
};

通常我会尽量避免通过 new 分配内存,因为我害怕内存泄漏并且对我的编程技能没有信心。什么是最明智的实施?

对于上述值类型,您无需担心。如果您需要引用类型,最佳做法是将它们包装在智能指针或专用类中,以便您可以它们视为值类型(通过使编译器生成的工作正常,您不必编写复制构造函数、赋值运算符和析构函数正确)。恐怕我不知道这个建议与 VC++ 6.0 的兼容性如何。

于 2013-01-18T14:00:22.007 回答
1
std::vector<testObject> testVector;
testVector.push_back(testObject(2));

C++11 中更快的替代方法是让向量就地创建 testObject:

testVector.emplace_back(2);

这不会产生任何不必要的复制或移动。

于 2013-01-18T16:45:22.973 回答
1

首先,我建议您遵守一些编码标准。虽然并不完美,但谷歌有不错的编码风格指南,你可以采用。

无论您要对代码做什么,除非您正在为名为 Object 的类编写某种测试,否则您可以考虑为您的类选择其他名称,例如 TestClass。这只是一个意图问题:如果您正在测试 C++ 的 OO 功能,那么 TestClass 比 testObject 更有意义。

此外,您的示例中没有代码可以验证您是否确实将对象附加到向量。你可以用这样的东西来做。

... some code here ...

int main()
{
    std::vector<testObject> testVector;
    std::cout << "Initial size: " << testVector.size() << std::endl;

    testVector.push_back(testObject(3));
    std::cout << "New size:     " << testVector.size() << std::endl;
}

我不知道您是否知道如何使用标准 I/O 流,但您的示例中没有处理 I/O,因此为了完整起见,请将 I/O 添加到您的示例中。

为了与前面的示例保持一致,我故意省略了应用我给你的任何风格建议,因为在某些上下文中的一致性也是良好编程风格的重要特征。

最后,为了回答您的原始问题,如果使用push_back,C++ 会将您的临时对象复制到向量的背面。(已由@FredOverflow 解释。)这基本上意味着vector 为您处理内存管理,因此您不必担心分配或解除分配,但您唯一关心的是您实际存储对象的位置(即在什么索引处)。

于 2013-01-18T22:14:16.183 回答