【问题标题】:Setting base object from derived class method从派生类方法设置基对象
【发布时间】:2015-05-27 12:59:31
【问题描述】:

我有一个类,它存储指向数据块的指针和数据的大小。它实现了诸如“头”、“尾”之类的操作……但从问题的角度来看,它是无关紧要的。我在不想深度复制的地方使用它而不是 std::vector 。 但是有时我需要复制数据,所以我有一个成员函数 'duplicate' 来做。

struct ByteArray {
    char* data;
    int size;
    ByteArray(char* data, int size) : data(data), size(size) {}
    ByteArray duplicate() const {
        char *duplicatedData = new char[size];
        memcpy(duplicatedData, data, size);
        return ByteArray(duplicatedData, size);
    }
};

现在我有一个派生类 - 扩展前一个类,我也需要一个重复的方法,它调用基类的副本。我设法通过将两个对象都转换为基类来解决它,但我怀疑这不是最好的解决方案。我错过了更明显的解决方案吗?这门课也是原始问题的正确解决方案(没有深拷贝)还是有我不知道的标准解决方案?

struct Foo : ByteArray
{
    int bar;
    ... // more members
    Foo(ByteArray &bytes, int bar) : ByteArray(bytes), bar(bar) {}
    Foo duplicate() const {
        Foo dup = *this;
        static_cast<ByteArray&>(dup) = ByteArray::duplicate();
        return dup;
    }
};

【问题讨论】:

  • 对不起,我明白了。由于多次编辑,基本方法的调用仍保持这种形式。我知道调用基方法的语法(在链接的答案中描述),但我更关心对转换为基类的对象的分配。 (我现在将编辑问题)

标签: c++ inheritance deep-copy


【解决方案1】:

如果您将 Foo 构造函数改为通过 const 引用获取 ByteArrayduplicate() 将非常简单:

Foo duplicate() const {
    return Foo(ByteArray::duplicate(), bar);
}

照原样,你仍然可以这样做,只需要多一行:

Foo duplicate() const {
    ByteArray ba = ByteArray::duplicate();
    return Foo(ba, bar);
}

【讨论】:

  • 我晚了几秒钟。
  • 对不起,我的问题错过了我在实际派生类中有几个成员的信息。现已更新
  • @simon 不知道为什么这很重要,只需将更多内容传递给您的构造函数?
【解决方案2】:

那么这样的事情怎么样...

#include <cstring>
#include <iostream>

using namespace std;

struct ByteArray {
  char* data;
  int size;
  ByteArray(char* data, int size) : data(data), size(size) {}
  void duplicate(ByteArray &toCopy) const {
    cout<<"Byte array duplicate."<<endl;
    char *data = new char[toCopy.size];
    memcpy(data, toCopy.data, size);
  }
};

struct Foo : ByteArray
{
  int bar;
  Foo(ByteArray &bytes, int bar) : ByteArray(bytes), bar(bar) {}
  void duplicate(Foo &toCopy) const {
    cout<<"Foo duplicate."<<endl;
    ByteArray::duplicate(toCopy);
  }
};

int main(){
  char* str = "some data";
  char* null = "";
  ByteArray barr (str, 9);
  ByteArray barr2 = barr;
  barr2.duplicate(barr);

  Foo farr (barr, 2);
  Foo farr2 = farr;
  farr2.duplicate(farr);

}

【讨论】:

  • 是的,但不幸的是,我在实际代码的 Foo 类中还有几个其他成员。
  • 另外,这不是调用base,而是派生的duplicate()的堆栈溢出吗?
  • 我修好了。它现在也演示了调用。
  • 我想,但我宁愿只有一个函数调用,也不愿在使用类的函数调用的情况下进行赋值。
  • 那么您希望能够同时使用foo2=foo.duplicate();foo3=foo; 第一个意思是深拷贝,第二个意思是浅拷贝?
猜你喜欢
  • 2013-03-28
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多