我成功地多載了 運算子,將 2 個相同大小的陣列加在一起。
這是我當前的代碼
//.h
#pragma once
#include <iostream>
template<typename T, size_t S>
class MyArray {
public:
T dataArray[S];
T& operator[](size_t arrayIndex);
const T& operator[](size_t arrayIndex) const;
MyArray<T, S> operator (const MyArray& secondSummand) const;
constexpr size_t getSize() const;
const T at(unsigned int arrayIndex) const;
void place(int arrayIndex, T arrayValue);
T* acces();//pointer to first array element
};
template<typename T, size_t S>
inline constexpr size_t MyArray<T, S>::getSize() const {
return S;
}
template<typename T, size_t S>
inline T& MyArray<T, S>::operator[](size_t arrayIndex) {
return dataArray[arrayIndex];
}
template<typename T, size_t S>
inline const T& MyArray<T, S>::operator[](size_t arrayIndex) const {
return dataArray[arrayIndex];
}
template<typename T, size_t S>
inline MyArray<T, S> MyArray<T, S>::operator (const MyArray& secondSummand) const {
MyArray returnArray{};
for (unsigned int i = 0; i < S; i ) {
returnArray[i] = this->at(i) secondSummand[i];
}
return returnArray;
}
template<typename T, size_t S>
inline const T MyArray<T, S>::at(unsigned int arrayIndex) const {
return dataArray[arrayIndex];
}
template<typename T, size_t S>
inline void MyArray<T, S>::place(int arrayIndex, T arrayValue) {
dataArray[arrayIndex] = arrayValue;
}
template<typename T, size_t S>
inline T* MyArray<T, S>::acces() {
return dataArray;
}
//main.cpp
#include <iostream>
#include <random>
#include "MyArray.h"
int main() {
{
srand((unsigned)time(0));
//Working fine
MyArray<int, 5> firstArray = {10, 5, 3, 2, 8};
MyArray<int, 5> secondArray = {5, 3, 5, 6, 2};
std::cout << "The first Array numbers are:\n";
for (unsigned int i = 0; i < firstArray.getSize(); i ) {
std::cout << firstArray[i] << " ";
}
std::cout << "\n\nThe second Array numbers are:\n";
for (unsigned int i = 0; i < secondArray.getSize(); i ) {
std::cout << secondArray[i] << " ";
}
MyArray<int, firstArray.getSize()> tempArray = firstArray secondArray;
std::cout << "\n\nAdd every position of 2 Arrays together:\n";
for (unsigned int i = 0; i < tempArray.getSize(); i ) {
std::cout << firstArray[i] << " " << secondArray[i] << " = " << tempArray[i] << "\n";
}
}
//Not working
MyArray<int, 5> firstArray = {10, 5, 3, 2, 8};
MyArray<int, 4> secondArray = {5, 3, 5, 6};
std::cout << "\n\nThe first Array numbers are:\n";
for (unsigned int i = 0; i < firstArray.getSize(); i ) {
std::cout << firstArray[i] << " ";
}
std::cout << "\n\nThe second Array numbers are:\n";
for (unsigned int i = 0; i < secondArray.getSize(); i ) {
std::cout << secondArray[i] << " ";
}
}
所以我的多載運算子適用于具有相同大小的物件(陣列)。如果我嘗試添加 2 個不同大小的物件,我會收到型別不同的錯誤
https://i.stack.imgur.com/7cZG4.png
如果我的理解是正確的,我的 運算子的回傳型別是一個 MyArray 物件,它具有與 左側的 summand 相同的模板引數。
在我的第二個示例“不作業”中,這應該是 T = int, S = 5 并且運算子的左側將是 const 對我的陣列的參考 T = int, S = 4
我不明白為什么這不起作用,因為我在沒有模板的情況下做了同樣的事情并且效果很好,有人可以向我解釋為什么我不能將 2 個不同大小的陣列與我的代碼一起添加,或者我可以做什么以便它接受不同的物件尺寸?
先感謝您
uj5u.com熱心網友回復:
在運算子函式的宣告中:
MyArray<T, S> operator (const MyArray& secondSummand) const;
當您使用 plainMyArray時,它暗示是MyArray<T, S>。模板引數T和S與“this”類和函式引數的類相同。
如果你想為你的引數使用不同的大小,那么你還需要使運算子函式成為一個模板,以提供不同大小的引數
template<size_t R>
MyArray<T, S> operator (const MyArray<T, R>& secondSummand) const;
請注意,根據 OP 的注釋,我將生成的陣列物件的大小保持為與“this”陣列物件的大小相同。
實作運算子時注意不要越界,您應該只回圈到兩個物件大小中的最小值,如果S > R那么結果陣列的其余部分可能應該為零初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478094.html
