小凯2013 发表于 2023-4-1 10:36:20

【在线等急】求助!


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 秒 ==========

求助!

zhangjinxuan 发表于 2023-4-1 10:36:21

主要是 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 等运算没有写呢

小凯2013 发表于 2023-4-1 10:39:41

42个错误!42.zip?
{:10_247:}{:10_247:}{:10_247:}

zhangjinxuan 发表于 2023-4-1 10:44:19

{: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

元豪 发表于 2023-4-1 10:47:12

小凯2013 发表于 2023-4-1 10:39
42个错误!42.zip?

666{:10_257:}

jhq999 发表于 2023-4-1 11:17:20

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);
}

不二猫猫 发表于 2023-4-1 11:29:48

这份代码编译出现了多个错误。

首先,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]
查看完整版本: 【在线等急】求助!