2016-03-29 30 views
-2

我必须编写一个类似C++向量的通用数据结构作为分配的一部分。如何将数据传递给模板集合

这是我的想法矢量:

template<typename T> 
class MyVector { 
private: 
    T* data_; 
    size_t size_; 
public: 
    MyVector(); 
    MyVector(const MyVector &otherVector); 

    // which one should I use? 
    add(const T& value); 
    add(T value); 

    ~MyVector(); 
}; 

现在我不知道如何将值传递给方法。来自Java我有点不知所措。在Java中,您将毫不犹豫地通过引用传递值,如果GC仍然被引用,则GC永远不会删除该对象。

在C++中,您将创建一个烂摊子,如果你会通过参考考虑代码通过这样的:

void myFunction(MyVector &myVector) { 
    int a = 5; 

    myVector.add(a); 
} 

int main() { 

    auto vector = MyVector<int>(); 

    myFunction(vector); 

    // now the vector contains a reference to 
    // something that doesn't exist anymore. 
} 

你怎么解决这个问题呢?你会通过引用并创建一个副本或通过值传递(它为您创建一个副本)

看看C++ std :: vector接口我看到他们使用引用。

如果您必须创建自己的副本,我只是看不到通过引用传递的值。

+0

如果向下投票这个问题,你可以请写明理由吗? – TimKaechele

+0

我怀疑你对C++中“通过引用传递对象”的含义没有一个确切的概念。 “通过引用并创建副本”是错误的;通过引用传递它是避免创建副本的C++方式。我建议你仔细阅读这个答案:http://stackoverflow.com/a/5922217/6022656 – max66

回答

1

add(const T& value)没问题,你应该确定T有正确定义的赋值运算符。所以,实现将是:

void Add(const T& value) { 
    if (m_size == m_maxSize) realloc(); // stuff to have enough space 
    m_data[m_size++] = value; // here copy is creating 
} 

默认的impl赋值操作符只是字节拷贝字段的类,它并不总是正确的。

其他的解决方案,如果你想要更多的Java风格的语义,是让T = shared_ptr<YourType>T = YourType* 后者是相当困难的,因为需要人工寿命控制的技能,因此是不可取的C++初学者。

void myFunction(MyVector<shared_ptr<X>> & myVector) 
{ 
    shared_ptr<X> x(new X(...)); 
    myVector.add(x); 
} 

与Java中的引用类似。 其他方式,即在过去的时代中:

template<typename T> 
class MyVector { 
private: 
    T** data_; // now you have array of pointers, so should be careful 
.... 
    add(T* value); 
.... 
} 

void myFunction(MyVector<X> & myVector) 
{ 
    X * x = new X(...); 
    myVector.add(x); // now x belongs to myVector and it should handle its lifetime 
} 
+0

非常感谢你,这解决了我的问题。 – TimKaechele