2013-12-06 2 views
0

Во-первых, я новичок, но с большим энтузиазмом отношусь к кодированию.C++ Inheritance: Как получить размер вызываемого объекта?

У меня есть этот базовый класс, из которого наследуются несколько классов. Функция записывается в базовый класс, для которого требуется размер вызываемого объекта. Во время кодирования функции размер неизвестен, поскольку функция может вызываться объектами разных производных классов. До сих пор я передавал размер в качестве аргумента, но должен быть каким-то образом.

Я попробовал sizeof (* this), но sizeof (* this) возвращает совершенно другое значение, которое не является ни размером базового класса, ни размером производного класса. Я смущен .... Любые объяснения?

+0

использование ** размерof (ClassName) ** – David

+1

Как вы знаете, что это не размер любого из классов? Возможно, вы являетесь жертвой [предположения о недопустимости заполнения] (http://stackoverflow.com/questions/5596428/sizeofstruct-returns-unexpected-value)? –

+0

http://stackoverflow.com/questions/937773/how-do-you-determine-the-size-of-an-object-in-c –

ответ

0

Просто используйте оператор sizeof() с именем класса. Вы можете найти размер любого класса с этим.

size = sizeof(ClassName); 
+2

Проблема в том, что такое 'ClassName'? Поскольку функция должна быть помещена в базовый класс, единственным именем _known_ является имя базового класса. Однако это не обязательно то, что хочет OP. Функция может быть вызвана на объект производного класса. – Damon

+0

@Damon: классы должны быть объявлены вверху, прежде чем определять какой-либо класс. Это решило проблему? –

+0

На самом деле OP не хочет иметь функцию в базовом классе, которая позже будет вызвана на некоторый объект производного типа. Конечно, вы не знаете этого типа во время написания этой функции, и не можете предсказать, какой тип какой-то части клиентского кода может вызвать эту функцию. – Damon

3

Вы можете написать виртуальную функцию, которая будет возвращать размер объекта

struct Base 
{ 
    virtual size_t size() const { return sizeof(*this); } 
    virtual ~Base(){} 
}; 

struct Derived1 : Base 
{ 
    virtual size_t size() const { return sizeof(*this); } 
    int x; 
}; 

struct Derived2 : Base 
{ 
    virtual size_t size() const { return sizeof(*this); } 
    int x; 
    int y; 
}; 

Base *b = new Base; 
Base *b1 = new Derived1; 
Base *b2 = new Derived2; 

std::cout << "b->size() = " << b->size() << std::endl; 
std::cout << "b1->size() = " << b1->size() << std::endl; 
std::cout << "b2->size() = " << b2->size() << std::endl; 
+0

Я новичок, поэтому 1) Что такое size_t? 2) Почему вы сделали это const? В чем проблема, если она не const? – daltonfury42

+0

size_t является типизированным типом целочисленного типа без знака. Это тип, возвращаемый оператором sizeof. Квалификатор const для функций-членов классов означает, что функции не меняют ни одного члена данных классов.Например, если объект, определенный как константный, вы можете вызывать только те функции-члены класса, которые имеют квалификатор const, поскольку постоянные объекты не могут быть изменены. –

0

Ок, попробую для ответа.

Acoording по этой ссылке: sizeof *this object

sizeof вычисляется во время компиляции, так что ваша функция будет всегда использовать размер базового объекта (если ваша функция не переопределена в подклассе).

Таким образом, лучшим решением является использование шаблонов. Как Damon отметил в комментариях, то любопытно повторяющийся узор шаблон этого решение здесь:

template <class ActualClass> 
class Base 
{ 
    size_t mySize() const { return sizeof(ActualClass); } 
} 

class Derived : public Base<Derived> 
{ 
}; 

EDIT: Это имеет недостаток, что ваш общий базовый класс будет на самом деле другой класс для каждого Derived.

+1

Я не уверен, что это хорошая идея, но один из способов избежать вашего недостатка - создать несимметричный класс «Base» и сделать «Base » от этого. Таким образом, каждый класс по-прежнему происходит от «Базы». – hvd

+0

Это действительно решит проблему, но не забудьте сделать 'mySize()' virtual, тогда – user1781290

Смежные вопросы