gpt4 book ai didi

c++ - 可能的继承范围问题 :

转载 作者:行者123 更新时间:2023-11-28 01:42:32 25 4
gpt4 key购买 nike

我有一个继承自BaseArray 类Array 类。在 BaseArray 中,我有 protected 成员变量 data_cur_size_Array 类引入了一个resize 函数。我遇到的问题是 BaseArray 中的 protected 成员变量似乎都没有在 resize 函数中访问。

编辑:解决了 max_size_ 问题,但 cur_size_data_ 文件仍然存在

继承?范围?帮忙?

错误:

In file included from Array.h:41:0,
from driver.cpp:6:
Array.cpp: In member function ‘void Array<T>::resize(size_t)’:
Array.cpp:29:5: error: ‘data_’ was not declared in this scope
data_=data_;
^
Array.cpp:30:18: error: ‘cur_size_’ was not declared in this scope
if (new_size>cur_size_)
^
Array.cpp:37:5: error: ‘cur_size_’ was not declared in this scope
cur_size_=new_size;
^

代码:

基本数组.h:

#ifndef _BASEARRAY_H_
#define _BASEARRAY_H_

#include <cstring>

template <typename T>
class BaseArray
{
public:
/// Type definition of the element type.
typedef T type;
//constructors, destructor and methods…
protected:
/// Pointer to the actual data. m
char * data_;

/// Current size of the BaseArray.
size_t cur_size_;

};

#include "BaseArray.inl"
#include "BaseArray.cpp"

#endif // !defined _BASEARRAY_H_

数组.h:

#ifndef _ARRAY_H_
#define _ARRAY_H_

#include <cstring>
#include "BaseArray.h"
template <typename T>
class Array: public BaseArray<T> //inheriting from BaseArray
{
public:
/// Type definition of the element type.
typedef T type;

/// Default constructor.
Array (void);

Array (const Array & arr);

/// Destructor.
~Array (void);
const Array & operator = (const Array & rhs);

void resize (size_t new_size);

private:
size_t max_size_; //introduces max_size
};

#include "Array.inl"
#include "Array.cpp"

#endif // !defined _ARRAY_H_

数组.cpp:

#include "BaseArray.h"
#include "Array.h"
#include <stdexcept>
#include <iostream>
template <typename T>
Array <T>::Array (void): BaseArray<T>()

{
std::cout<<"Array def const called"<<std::endl;
}

template <typename T>
Array <T>::Array (const Array & array): BaseArray<T>(array)
{
}

template <typename T>
Array <T>::~Array (void)
{
}


template <typename T>
void Array <T>::resize (size_t new_size)
{
this->data_= this->data_;
if (new_size>this->cur_size_)
{
max_size_ = new_size-this->cur_size_-1;
this->cur_size_=new_size;
for (max_size_; max_size_<=new_size; max_size_++)
this->data_[max_size_]=0;
}
this->cur_size_=new_size;

}

/* Also tried it like this:

template <typename T>
void Array <T>::resize (size_t new_size)
{
BaseArray<T>::data_= BaseArray<T>::data_;
if (new_size>BaseArray<T>::cur_size_)
{
max_size_ = new_size-BaseArray<T>::cur_size_-1;
BaseArray<T>::cur_size_=new_size;
for (max_size_; max_size_<=new_size; max_size_++)
BaseArray<T>::data_[max_size_]=0;
}
BaseArray<T>::cur_size_=new_size;
} */

最佳答案

关于第一个错误,您没有在数组中声明 max_size() 成员。

关于第二个错误,模板中的名称查找遵循两阶段逻辑,其中在定义点查找非依赖表达式,而在实例化点查找依赖表达式;

这意味着当编译器看到 data_ 时,它认为这是一个位于其他地方的变量;充其量,它不会发现它给你一个错误,在最坏的情况下,它会给你错误的变量!

为了解决这个问题,你需要使它成为一个依赖表达式,最明显的方法是将所有 data_ 替换为 this->data_ 等。 .

关于您的代码组织,将您的模板定义到单个头文件中;如果您真的想拆分成员实现,请将它们放在一个具有合理文件扩展名的文件中(inl 可以,cpp 不行)...

关于c++ - 可能的继承范围问题 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com