鱼C论坛

 找回密码
 立即注册
查看: 1639|回复: 0

C++堆栈类的子类出错。

[复制链接]
发表于 2014-1-28 20:28:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/************************************************
 * stack_test -- Test the use of the classes    *
 *      stack and safe_stack.                   *
 ************************************************/
#include <iostream>
// The largest stack we can use
// (private to class stack and safe_stack)
const int STACK_MAX = 100;
/************************************************
 * stack -- Class to provide a classic stack.   *
 *                                              *
 * Member functions:                            *
 *      push -- Push data on to the stack.      *
 *      pop -- Return the top item from the     *
 *              stack.                          *
 *                                              *
 * Warning: There are no checks to make sure    *
 *      that stack limits are not exceeded.     *
 ************************************************/
class stack {
    protected:
        int count; // Number of items in the stack
        int *data; // The stack data
    public:
        // Initialize the stack
        stack(void): count(0)
        {
            data = new int[STACK_MAX];
        }
        // Destructor
        virtual ~stack(void) {
            delete data;
            data = NULL;
        }
    private:
        // No copy constructor
        stack(const stack &);
        // No assignment operator
        stack & operator = (const stack &);
    public:
        // Push an item on the stack
        void push(
            const int item       // Item to push
        ) {
            data[count] = item;
            ++count;
        }
        // Remove the an item from the stack
        int pop(void) {
            --count;
            return (data[count]);
        }
        // Function to count things in
        // an array of stacks
        friend void stack_counter(
            stack stack_array[],
            const int n_stacks
        );
};
/***********************************************
 * safe_stack -- Like stack, but checks for    *
 *      errors.                                *
 *                                             *
 * Member functions: push and pop              *
 *              (just like stack)              *
 ***********************************************/
class safe_stack : public stack {
    public:
        const int max;  // Limit of the stack
    public:
        safe_stack(void): max(STACK_MAX) {};
        // Destructor defaults
    private:
        // No copy constructor
        safe_stack(const safe_stack &);
        // No assignment operator
        safe_stack & operator =
            (const safe_stack &);
    public:
        // Push an item on the stack
        void push(
            // Data to push on the stack
            const int data
        ) {
            if (count >= (STACK_MAX-1)) {
                std::cout << "Stack push error\n";
                exit (8);
            }
            stack::push(data);
        }
        // Pop an item off the stack
        int pop(void) {
            if (count <= 0) {
                std::cout << "Stack pop error\n";
                exit (8);
            }
            return (stack::pop());
        }
};
/************************************************
 * stack_counter -- Display the count of the    *
 *      number of items in an array of stacks.  *
 ************************************************/
void stack_counter(
    // Array of stacks to check
    stack *stack_array,
    // Number of stacks to check
    const int n_stacks
)
{
    int i;
    for (i = 0; i < n_stacks; ++i)
    {
        std::cout << "Stack " << i << " has " <<
            stack_array[i].count << " elements\n";
    }
}
// A set of very safe stacks for testing
static safe_stack stack_array[5];
int main()
{
    stack_array[0].push(0);
    stack_array[1].push(0);
    stack_array[1].push(1);
    stack_array[2].push(0);
    stack_array[2].push(1);
    stack_array[2].push(2);
    stack_array[3].push(0);
    stack_array[3].push(1);
    stack_array[3].push(2);
    stack_array[3].push(3);
    stack_array[4].push(0);
    stack_array[4].push(1);
    stack_array[4].push(2);
    stack_array[4].push(3);
    stack_array[4].push(4);
    stack_counter(stack_array, 5);
    return (0);
}
上面的代码大家可以看看,编译一下,就知道了。safe_stack不安全,哈哈。求解决办法。
StackOverflow和Yahoo Ask上面的答案已经把我搞蒙了。书上的解释也好乱。求大神。
下面是书上的解释:
We have an array of a derived class called safe stack. In C++, you can use a base class pointer (stack*) to point to a derived class (safe_stack). The system will see only the base part of the object, but you can still point to it.
fig257_01_0[1].jpg
Now a pointer can point to a single instance of a class or an array of objects.
fig257_02_0[1].jpg
So we have the following two rules:
  • A base pointer can point to a derived object.
  • An object pointer can point to an array of objects.

From this, we can conclude:
  • A base pointer can point to an array of derived objects.

That's wrong.
The problem is that an array of derived objects is not the same as an array of base objects.
fig257_03_0[2].jpg
So if we take a base pointer and point it a derived array, the memory layout will be wrong.
fig258_01[2].jpg
好啦,请注意!!!
我需要一个解决方案。建议使用dynamic_cast或者reinterpret_cast,不可以告诉我使用STL。
如果是要使用auto_ptr或者share_ptr一类的能解决也行。多谢多谢。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表