将 class 的“*”运算符重载到 return class 变量
Overloading "*" operator for a class to return class variable
我有两个cpp文件和一个hpp文件。 Main.cpp、Ab.cpp 和 Ab.hpp。
在这些文件中,我创建了一个 class 'Ab',它有一个默认构造函数和
一个接受字符串的构造函数。在 class 中,我想重新定义 * 运算符以将给定值设置为 class 的对象,并删除分配给它的任何先前值。
值得一提的是,我被指示不允许在此任务中使用任何复制构造函数或复制赋值。这意味着我必须求助于使用纯粹的移动构造函数和移动赋值。在这些主题中,我的知识非常有限,因为我之前只使用过基本的 C#。
Main.cpp如下:
#include <iostream>
#include "Ab.hpp"
A MoveTest(std::string testData)
{
return Ab(new std::string(testData));
}
int main()
{
std::cout << "-----'Ab' Test Begin-----" << std::endl;
std::cout << "'Ab' test: Constructor begins." << std::endl;
Ab emptyAb;
Ab moveTestAb(new std::string("To remove"));
std::cout << "'Ab' test: Constructor done. Press enter to continue." << std::endl;
std::cin.get();
std::cout << "Ab' test: Moveoperator begins." << std::endl;
moveTestAb = MoveTest("This is a test movement");
std::cout << "Expected output: " << "This is a test movement" << std::endl;
std::cout << "Output from moveTestAb: " << *moveTestAb << std::endl;
std::cout << "'Ab' test: Moveoperator done. Press enter to continue." << std::endl;
std::cin.get();
std::cout << "-----'Ab' Test End-----" << std::endl;
std::cin.get();
}
Ab.cpp如下:
#include "Ab.hpp"
std::string Ab::Get() const
{
return "test";
}
bool Ab::Check() const
{
bool return_value = true;
if (this==NULL)
{
return_value = false;
}
return return_value;
}
Ab & Ab::operator=(const Ab &ptr)
{
return *this;
}
Ab & Ab::operator*(Ab &other)
{
if (this != &other) {
delete this->a_string;
this->a_string = other.a_string;
other.a_string = nullptr;
}
Ab *thing_to_return = &Ab(this->a_string);
return *thing_to_return;
}
Ab.hpp如下
#include <string>
class Ab
{
Ab(const Ab&) = delete;
std::string* a_string;
public:
Ab &operator=(const Ab&);
Ab& operator*(Ab&);
Ab();
Ab(std::string *the_string):
a_string(the_string){};
int b = 0;
int a = 3;
std::string Get() const;
~Ab() = default;
bool Check() const;
private:
int z = 0;
};
我目前遇到错误:
no operator "*" matches these operands -- operand types are: * AB
Ab& operator*(Ab&);
这不允许你做 *ab
。当您执行 ab*ab
时会调用此运算符;
https://gcc.godbolt.org/z/SDkcgl
Ab *thing_to_return = &Ab(this->a_string);
此处您将指针指向一个临时对象。您的代码存在更多问题。我建议逐步重写
使用他在原始问题上写的 AndyG 的评论解决了问题。
包含解决方案的评论:
when you call moveTestAb the compiler will search for a function matching the signature of Ab::operator() . Notice how the function doesn't take any parameters - AndyG
我有两个cpp文件和一个hpp文件。 Main.cpp、Ab.cpp 和 Ab.hpp。
在这些文件中,我创建了一个 class 'Ab',它有一个默认构造函数和 一个接受字符串的构造函数。在 class 中,我想重新定义 * 运算符以将给定值设置为 class 的对象,并删除分配给它的任何先前值。
值得一提的是,我被指示不允许在此任务中使用任何复制构造函数或复制赋值。这意味着我必须求助于使用纯粹的移动构造函数和移动赋值。在这些主题中,我的知识非常有限,因为我之前只使用过基本的 C#。
Main.cpp如下:
#include <iostream>
#include "Ab.hpp"
A MoveTest(std::string testData)
{
return Ab(new std::string(testData));
}
int main()
{
std::cout << "-----'Ab' Test Begin-----" << std::endl;
std::cout << "'Ab' test: Constructor begins." << std::endl;
Ab emptyAb;
Ab moveTestAb(new std::string("To remove"));
std::cout << "'Ab' test: Constructor done. Press enter to continue." << std::endl;
std::cin.get();
std::cout << "Ab' test: Moveoperator begins." << std::endl;
moveTestAb = MoveTest("This is a test movement");
std::cout << "Expected output: " << "This is a test movement" << std::endl;
std::cout << "Output from moveTestAb: " << *moveTestAb << std::endl;
std::cout << "'Ab' test: Moveoperator done. Press enter to continue." << std::endl;
std::cin.get();
std::cout << "-----'Ab' Test End-----" << std::endl;
std::cin.get();
}
Ab.cpp如下:
#include "Ab.hpp"
std::string Ab::Get() const
{
return "test";
}
bool Ab::Check() const
{
bool return_value = true;
if (this==NULL)
{
return_value = false;
}
return return_value;
}
Ab & Ab::operator=(const Ab &ptr)
{
return *this;
}
Ab & Ab::operator*(Ab &other)
{
if (this != &other) {
delete this->a_string;
this->a_string = other.a_string;
other.a_string = nullptr;
}
Ab *thing_to_return = &Ab(this->a_string);
return *thing_to_return;
}
Ab.hpp如下
#include <string>
class Ab
{
Ab(const Ab&) = delete;
std::string* a_string;
public:
Ab &operator=(const Ab&);
Ab& operator*(Ab&);
Ab();
Ab(std::string *the_string):
a_string(the_string){};
int b = 0;
int a = 3;
std::string Get() const;
~Ab() = default;
bool Check() const;
private:
int z = 0;
};
我目前遇到错误:
no operator "*" matches these operands -- operand types are: * AB
Ab& operator*(Ab&);
这不允许你做 *ab
。当您执行 ab*ab
时会调用此运算符;
https://gcc.godbolt.org/z/SDkcgl
Ab *thing_to_return = &Ab(this->a_string);
此处您将指针指向一个临时对象。您的代码存在更多问题。我建议逐步重写
使用他在原始问题上写的 AndyG 的评论解决了问题。
包含解决方案的评论:
when you call moveTestAb the compiler will search for a function matching the signature of Ab::operator() . Notice how the function doesn't take any parameters - AndyG