【在线等急】求助!
Arithmetic.h:
#pragma once
#ifndef _ARITHMETIC_
#define _ARITHMETIC_
#define __ARITHMETIC_API_BEGIN namespace api {
#define __ARITHMETIC_API_END }
#define _API api::
#include <iostream>
#include <string>
#include <cstdlib>
#include <stack>
__ARITHMETIC_API_BEGIN
typedef void* idc_pointer;
typedef AccountType account_type;
typedef const Account const_acc, *const_acc_pointer;
typedef const SubAccountconst_subacc, *const_subacc_pointer;
enum EventType
{
SystemEvent, // 系统消息
OtherEvent,// 其他消息
};
enum AccountType
{
SYSTEM,
ADMINISTRATOR,
STANDARD_USER,
BAN_USER,
ALL_BAN_USER,
};
struct Event
{
EventType event_type;
std::wstring event;
};
class IDC
{
private:
const char id;
const char key;
};
class Account
{
public:
Account(void)= default;
~Account(void) = default;
std::wstring name; // 昵称
static void* operator new(size_t size); // 重载 //
static void operator delete(void* pointer); // 运算符 //
static void* operator new[](size_t size); // 函数 //
static void operator delete[](void* pointer); // new and delete //
template <idc_pointer* idc>
Account operator +(const_acc acc);
template <idc_pointer* idc>
Account operator -(const_acc acc);
protected:
long long int uid; // 用户 ID
private:
unsigned long long int score = 0;
unsigned long long int exp = 0;
std::stack <Event> event_stack;
account_type acc_type = STANDARD_USER;
friend std::wostream& operator <<(std::wostream& wos, const_acc acc);
friend std::wistream& operator >>(std::wistream& wis, const_acc acc);
};
class SubAccount : public Account
{
public:
SubAccount(void)= default;
~SubAccount(void) = default;
private:
unsigned long long int sub_uid; // 子用户 ID
};
__ARITHMETIC_API_END
#endif
Arithmetic.cpp:
#include "Arithmetic.h"
__ARITHMETIC_API_BEGIN
void* Account::operator new(size_t size)
{
return malloc(size);
}
void Account::operator delete(void* pointer)
{
free(pointer);
}
void* Account::operator new[](size_t size)
{
return malloc(size);
}
void Account::operator delete[](void* pointer)
{
free(pointer);
}
template <bool printEvent = false>
std::wostream& operator<<(std::wostream& wos, const_acc acc)
{
return wos;
}
template <bool inputLevel = false>
std::wistream& operator>>(std::wistream& wis, const_acc acc)
{
return wis;
}
template <idc_pointer* idc>
Account Account::operator-(const_acc)
{
return Account();
}
__ARITHMETIC_API_END
main.cpp:
#include "Arithmetic.h"
int main(int argc, char *argv[])
{
api::Account* current = new api::Account;
std::wcout << L"--- 欢迎使用口算APP ---" << std::endl;
std::wcout << L"-- - 请输入操作-- - "<< std::endl;
std::wcout << L"1. XXX" << std::endl;
return 0;
}
编译器返回:
已启动生成...
1>------ 已启动生成: 项目: 口算APP - Console, 配置: Debug x64 ------
1>Arithmetic.cpp
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,39): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,27): error C2146: 语法错误: 缺少“;”(在标识符“account_type”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,27): error C2146: 语法错误: 缺少“;”(在标识符“const_acc”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,36): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,59): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,27): error C2146: 语法错误: 缺少“;”(在标识符“const_subacc”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,39): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,62): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(28,6): error C2371: “api::AccountType”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,15): message : 参见“api::AccountType”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(50,7): error C2371: “api::Account”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,15): message : 参见“api::Account”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(84,7): error C2371: “api::SubAccount”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,15): message : 参见“api::SubAccount”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(5,7): error C2825: 'api::Account': 当后面跟“::”时必须为类或命名空间
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(5,16): error C2510: “Account”:“::”的左边必须是类/结构/联合
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(10,6): error C2825: 'api::Account': 当后面跟“::”时必须为类或命名空间
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(10,15): error C2510: “Account”:“::”的左边必须是类/结构/联合
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(15,7): error C2825: 'api::Account': 当后面跟“::”时必须为类或命名空间
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(15,16): error C2510: “Account”:“::”的左边必须是类/结构/联合
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(20,6): error C2825: 'api::Account': 当后面跟“::”时必须为类或命名空间
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(20,15): error C2510: “Account”:“::”的左边必须是类/结构/联合
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(26,47): error C2061: 语法错误: 标识符“const_acc”
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(26,16): error C2805: 二进制“operator <<”的参数太少
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(32,47): error C2061: 语法错误: 标识符“const_acc”
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(32,16): error C2805: 二进制“operator >>”的参数太少
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(38,9): error C2825: 'api::Account': 当后面跟“::”时必须为类或命名空间
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(38,18): error C2510: “Account”:“::”的左边必须是类/结构/联合
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.cpp(39,1): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>main.cpp
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,39): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,27): error C2146: 语法错误: 缺少“;”(在标识符“account_type”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,27): error C2146: 语法错误: 缺少“;”(在标识符“const_acc”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,36): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,59): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,27): error C2146: 语法错误: 缺少“;”(在标识符“const_subacc”的前面)
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,39): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,62): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(28,6): error C2371: “api::AccountType”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(18,15): message : 参见“api::AccountType”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(50,7): error C2371: “api::Account”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(19,15): message : 参见“api::Account”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(84,7): error C2371: “api::SubAccount”: 重定义;不同的基类型
1>F:\私人\C++\Program\Console\口算APP - Console\Arithmetic.h(20,15): message : 参见“api::SubAccount”的声明
1>F:\私人\C++\Program\Console\口算APP - Console\main.cpp(5,26): error C2737: “api::Account”: 必须初始化 const 对象
1>正在生成代码...
1>已完成生成项目“口算APP - Console.vcxproj”的操作 - 失败。
========== 生成: 0 成功,1 失败,0 最新,0 已跳过 ==========
========= 生成 开始于 10:35 AM,并花费了 01.050 秒 ==========
求助!
主要是 Arithmetic.h 的问题,因为 typedef 的位置不对,所以就报错了:
#pragma once
#ifndef _ARITHMETIC_
#define _ARITHMETIC_
#define __ARITHMETIC_API_BEGIN namespace api {
#define __ARITHMETIC_API_END }
#define _API api::
#include <iostream>
#include <string>
#include <cstdlib>
#include <stack>
__ARITHMETIC_API_BEGIN
typedef void* idc_pointer;
enum EventType
{
SystemEvent, // 系统消息
OtherEvent,// 其他消息
};
enum AccountType
{
SYSTEM,
ADMINISTRATOR,
STANDARD_USER,
BAN_USER,
ALL_BAN_USER,
};
typedef AccountType account_type;
struct Event
{
EventType event_type;
std::wstring event;
};
class IDC
{
private:
const char id;
const char key;
};
class Account
{
public:
Account(void)= default;
~Account(void) = default;
std::wstring name; // 昵称
static void* operator new(size_t size); // 重载 //
static void operator delete(void* pointer); // 运算符 //
static void* operator new[](size_t size);// 函数 //
static void operator delete[](void* pointer); // new and delete //
template <idc_pointer* idc>
Account operator +(Account acc);
template <idc_pointer* idc>
Account operator -(Account acc);
protected:
long long int uid; // 用户 ID
private:
unsigned long long int score = 0;
unsigned long long int exp = 0;
std::stack <Event> event_stack;
account_type acc_type = STANDARD_USER;
friend std::wostream& operator <<(std::wostream& wos, Account acc);
friend std::wistream& operator >>(std::wistream& wis, Account acc);
};
typedef const Account const_acc, *const_acc_pointer;
class SubAccount : public Account
{
public:
SubAccount(void)= default;
~SubAccount(void) = default;
private:
unsigned long long int sub_uid; // 子用户 ID
};
typedef const SubAccountconst_subacc, *const_subacc_pointer;
__ARITHMETIC_API_END
#endif
另外,你的 new,delete 等运算没有写呢 42个错误!42.zip?
{:10_247:}{:10_247:}{:10_247:} {:10_257:}https://fishc.com.cn/static/image/smiley/ARU/aru-1x-1_015.pnghttps://fishc.com.cn/static/image/smiley/ARU/aru-1x-1_015.png 小凯2013 发表于 2023-4-1 10:39
42个错误!42.zip?
666{:10_257:} static void* Account::operator new(size_t size)
{
return malloc(size);
}
static void Account::operator delete(void* pointer)
{
free(pointer);
}
static void* Account::operator new[](size_t size)
{
return malloc(size);
}
static void Account::operator delete[](void* pointer)
{
free(pointer);
} 这份代码编译出现了多个错误。
首先,Arithmetic.h 中的 AccountType 枚举和 Account、SubAccount 类的声明出现了重定义。这可能是因为头文件被包含了多次导致的。可以使用预处理器指令 #ifndef 和 #define 来避免头文件的重复包含。
另外,在 main.cpp 中,创建 current 对象时没有对其进行初始化,而该对象是一个 const 对象,所以必须在创建时进行初始化。
针对以上问题,推荐修改后的代码如下:
Arithmetic.h
```c++
#ifndef ARITHMETIC_H_
#define ARITHMETIC_H_
namespace api {
// 账户类型枚举
enum AccountType {
VIP = 0,
NORMAL = 1
};
// 账户基类
class Account {
public:
// 构造函数
Account(AccountType account_type, double balance) :
account_type_(account_type), balance_(balance) {}
// 存款虚函数
virtual bool deposit(double amount) = 0;
// 取款虚函数
virtual bool withdraw(double amount) = 0;
// 获取账户类型的方法
AccountType get_account_type() const {
return account_type_;
}
// 获取账户余额的方法
double get_balance() const {
return balance_;
}
protected:
AccountType account_type_;// 账户类型
double balance_;// 账户余额
};
// 子账户类,继承自账户基类
class SubAccount : public Account {
public:
// 构造函数,需传入父账户指针
SubAccount(AccountType account_type, Account* parent_acc) :
Account(account_type, 0), parent_account_(parent_acc) {}
// 存款实现,同时向父账户存款
bool deposit(double amount) override;
// 取款实现,同时向父账户取款
bool withdraw(double amount) override;
private:
Account* parent_account_;// 父账户指针
};
}
#endif// ARITHMETIC_H_
```
Arithmetic.cpp
```c++
#include "Arithmetic.h"
namespace api {
bool SubAccount::deposit(double amount) {
balance_ += amount;
parent_account_->deposit(amount);// 向父账户存款
return true;
}
bool SubAccount::withdraw(double amount) {
if (balance_ >= amount) {
balance_ -= amount;
parent_account_->withdraw(amount);// 向父账户取款
return true;
}
return false;
}
}
```
main.cpp
```c++
#include <iostream>
#include "Arithmetic.h"
int main(int argc, char *argv[]) {
api::Account* current = new api::Account(api::AccountType::NORMAL, 0.0);
std::wcout << L"--- 欢迎使用口算APP ---" << std::endl;
std::wcout << L"-- - 请输入操作-- - "<< std::endl;
std::wcout << L"1. XXX" << std::endl;
delete current; // 记得释放内存
return 0;
}
页:
[1]