2015-05-27 6 views
1

У меня есть класс, который хранит указатель на кусок данных и размер данных. Он реализует операции типа «голова», «хвост», ... но это не имеет отношения к вопросу. Я использую это вместо 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; 
    } 
}; 
+0

Вы читали это: http://stackoverflow.com/questions/357307/how-to-call-a-parent-class-function-from-derived-class-function – NathanOliver

+0

К сожалению, я вижу. Из-за нескольких изменений вызов базового метода оставался в этой форме. Я знаю синтаксис метода базового вызова (описанный в связанном ответе), но меня больше интересует назначение объекта, отлитого от базового класса. (Сейчас я отредактирую вопрос) – simon

ответ

1

Если вы изменили Foo конструктор принять ByteArray по Const ссылку на вместо duplicate() будет довольно просто:

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

как есть, вы можете сделать это таким же образом, просто нужна дополнительная линия:

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

Я был на несколько секунд слишком поздно. –

+0

Извините, мой вопрос пропустил информацию о том, что у меня есть несколько членов в фактическом производном классе. Обновлено – simon

+0

@simon Не знаете, почему это имеет значение, просто перейдите в свой конструктор? – Barry

0

Как насчет чего-то подобного ...

#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); 

} 
+0

Да, но у меня есть несколько дополнительных членов в классе Foo для реального кода. – simon

+0

Кроме того, не будет ли это переполнение стека, не вызывающее базу, но полученный дубликат()? – simon

+0

Я исправил его. Он также демонстрирует вызовы. –