鱼C论坛

 找回密码
 立即注册
查看: 1342|回复: 6

[已解决]【在线等急】求助!

[复制链接]
发表于 2023-4-1 10:36:20 | 显示全部楼层 |阅读模式
10鱼币

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 SubAccount  const_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[18];
        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 秒 ==========
求助!
最佳答案
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[18];
        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 SubAccount  const_subacc, *const_subacc_pointer;
__ARITHMETIC_API_END

#endif
另外,你的 new,delete 等运算没有写呢

最佳答案

查看完整内容

主要是 Arithmetic.h 的问题,因为 typedef 的位置不对,所以就报错了: 另外,你的 new,delete 等运算没有写呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[18];
        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 SubAccount  const_subacc, *const_subacc_pointer;
__ARITHMETIC_API_END

#endif
另外,你的 new,delete 等运算没有写呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 10:39:41 | 显示全部楼层
42个错误!42.zip?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 10:44:19 | 显示全部楼层

                               
登录/注册后可看大图

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 10:47:12 | 显示全部楼层

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表