【发布时间】:2021-04-23 01:44:56
【问题描述】:
我正在学习 C++,并且有一个与类和模板相关的问题。 我知道为班级中的每个变量设置“getter”和“setter”函数是一种很好的做法。但是使用下面显示的代码,您是否应该为数组提供“getter”函数?理论上,打印函数的作用与“getter”函数的作用相同——打印出数组中的所有内容。如果需要,返回该数组的正确代码是什么?该数组是一个类对象数组。
到目前为止我的想法和代码:
queue.h
#pragma once
template<class T>
class Queue {
public:
Queue(int = 1);
~Queue();
void setQueue(int);
void enqueue(T);
void dequeue();
const T* getQueueArray() const;
const int getArraySize() const;
const int getArrayIndex() const;
void printQueue();
private:
T* queueArray;
int arraySize, arrayIndex;
};
queue.cpp
#include <iostream>
#include "queue.h"
template<class T>
Queue<T>::Queue(int arraySize) {
this->setQueue(arraySize);
}
template<class T>
Queue<T>::~Queue() {
delete [] this->queueArray;
}
template<class T>
void Queue<T>::setQueue(int arraySize) {
this->arraySize = arraySize;
delete [] this->queueArray;
this->queueArray = new T[arraySize];
this->arrayIndex = 0;
}
template<class T>
void Queue<T>::enqueue(T object) {
if (this->arrayIndex == this->arraySize) {
std::cout << "Rinda ir pilna, nevar pievienot elementu!\n";
}
else {
this->queueArray[this->arrayIndex] = object;
this->arrayIndex++;
}
}
template<class T>
void Queue<T>::dequeue() {
if (this->arrayIndex == 0) {
std::cout << "Rinda ir tuksa!\n";
}
else {
for (int i = 0; i < this->arraySize - 1; i++) {
this->queueArray[i] = this->queueArray[i + 1];
}
this->arrayIndex--;
}
}
template<class T>
const T* Queue<T>::getQueueArray() const {
return this->queueArray;
}
template<class T>
const int Queue<T>::getArraySize() const {
return this->arraySize;
}
template<class T>
const int Queue<T>::getArrayIndex() const {
return this->arrayIndex;
}
template<class T>
void Queue<T>::printQueue() {
for (int i = 0; i < this->arrayIndex; i++) {
std::cout << i + 1 << ". ";
this->queueArray[i].printHuman();
}
}
数组 getter 函数工作并返回一个内存地址。这种行为正确吗?
我想问另一个问题,关于类打印功能,这将是更好的 2:std::cout << "something something" << classVariable;
要么
std::cout << "something something" << getClassVariable();
一种方法是直接访问变量,另一种方法是使用“getter”函数。使用类似的功能是否会显着影响性能?
【问题讨论】:
-
值得一读,因为你的代码不会这样编译:Why can templates only be implemented in the header file?
-
“我知道这是好的做法”应该是“我知道这是不好的做法”。 Getter 和/或 setter 仅在必要时使用。
-
#include "queue.cpp"不要那样做。 -
getter 和 setter 方法允许通过接口访问。他们隐藏了实现。例如,可以将它们更改为计算值而不破坏接口,而不是返回硬编码值。直接访问使得耦合更紧密,增加了模块之间的依赖关系。
-
您希望为实际上属于该类的公共可用 API 的内容而不是不属于该类的内容提供 getter。你正在写一个队列,而不是一个数组。这意味着您可以通过
top或front方法访问,而不是通过将原始指针传递给内部存储表示。
标签: c++ arrays class templates return