解析指针并在类之间使用它们[C ++]

如何解决解析指针并在类之间使用它们[C ++]

因此,我对C++还是陌生的,而且我只是几周左右才开始编写代码。我遇到了一个无法解决的问题。每次学习一种新的编程语言时,我都会挑战自己编写一个小程序(不太复杂),该程序将我已经学到的关于该语言的所有内容(函数,类,数组,指针等)归为一组。很好地了解了该语言的编码方式。

因此,我决定制作第一个名为Chek的C++程序,以每小时,每分钟或每秒钟用户可以输入的速度检查当前的MBPS(连接速度)。像我的所有程序一样,我使用的是我在Java (因为我对Java的了解很流畅)中进行编码时发现的结构。看起来像这样:

我还在 Lib / Arguments.cpp中添加了关于我的问题总体上在哪里的评论。 假设我要在Java中编写Chek。我的结构如下:

Chek or Main class
  |- Core
       |- Core (The class that handles initiating each core's libraries)
       |- Arguments (For parsing,checking and understand arguments)
       |- Broadcast (To print to screen and so on)
       |- Network (For network interaction)
       |- Logs (To save to file logs)
  Then the rest ...

每个Core's libCore处理,就像...要调用Broadcast方法,我会这样做:

Main().getCore().getBroadcast().BroadcastMsg("Hello!");

因此,我可以访问所有库,方法和变量,而无需创建死锁或任​​何无限的导入循环。

我的问题是我正在尝试用C ++做到这一点,但是它不起作用!我已经尝试了很多方法,更改了指向Object的指针等等,但是它不起作用,所以我需要帮助!

这是我的代码(我也在使用Visual Studio ): Chek.cpp:

#include "pch.h"
#include "Main.h"
#include "Core.h"
#include <iostream>

int main(int argc,char *argv[])
{
    Core* Ptr = new Core;
    Main OBJ; Main* Ptr2; Ptr2 = &OBJ;
    std::cout << "Generated PTR's!" << std::endl;
    std::cout << "Core PTR -> " << Ptr << std::endl;
    std::cout << "Main PTR -> " << Ptr2 << std::endl << std::endl;
    Ptr2->SetCrPtr(Ptr);
    Ptr2->loadChek(argv);
}

Main / Main.h:

#pragma once
#ifndef __MAIN_H
#define __MAIN_H

class Core;

class Main
{
public:
    Main();

private:
    Core* CrPtr;

public:
    void loadChek(char *arguments[]);
    void SetCrPtr(Core* Ptr);
    Core* getCrPtr();
};

#endif

Main / Main.cpp:

#include "pch.h"
#include "Main.h"
#include "Core.h"
#include "Arguments.h"
#include "Broadcast.h"
#include <iostream>

using namespace std;

Main::Main() : CrPtr() {};

void Main::SetCrPtr(Core* Ptr)
{
    std::cout << "[Main] Setting CrPtr to " << Ptr << std::endl;
    this->CrPtr = Ptr;
}

Core* Main::getCrPtr() 
{
    return this->CrPtr;
}

void Main::loadChek(char *arguments[])
{
    char *allArguments[sizeof(arguments)];

    this->CrPtr->SetMnPtr(this);
    this->CrPtr->setArguments();
    this->CrPtr->setBroadcast();
    this->CrPtr->getBroadcast()->Log(1,"Loading arguments ...\n");
    this->CrPtr->getArguments()->parseArguments(arguments,allArguments);
}

Core / Core.h:

#pragma once
#ifndef __CLASS_H
#define __CLASS_H
#include "Arguments.h"
#include "Broadcast.h"

class Main;

class Core
{
public:
    Core();

private:
    Main* MnPtr;
    Arguments* ArgPtr;
    Broadcast* BrdPtr;

public:
    Arguments* getArguments();
    void setArguments();
    Broadcast* getBroadcast();
    void setBroadcast();
    void SetMnPtr(Main* Ptr);
};

#endif

Core / Core.cpp:

#include "pch.h"
#include "Core.h"
#include "Main.h"

Core::Core() : MnPtr() {}

void Core::SetMnPtr(Main* Ptr) 
{
    std::cout << "[Core] Setting MnPtr to " << Ptr << std::endl;
    this->MnPtr = Ptr;
}

void Core::setArguments() 
{
    this->ArgPtr = new Arguments;
    std::cout << "[Core] Setting Argument's MnPtr to " << this->MnPtr << std::endl;
    this->ArgPtr->SetMnPtr(this->MnPtr);
}

void Core::setBroadcast()
{
    this->BrdPtr = new Broadcast;
    std::cout << "[Core] Setting Broadcast's MnPtr to " << this->MnPtr << std::endl;
    this->BrdPtr->SetMnPtr(this->MnPtr);
}

Arguments* Core::getArguments()
{
    return ArgPtr;
}

Broadcast* Core::getBroadcast()
{
    return BrdPtr;
}

库/参数.h:

#pragma once

class Main;

class Arguments
{
public:
    Arguments();

private:
    Main* MnPtr;

public:
    void parseArguments(char *arguments[],char *argumentsElements[]);
    void SetMnPtr(Main* Ptr);
    Main* GetMnPtr();
};

库/Arguments.cpp:

#include "pch.h"
#include "Arguments.h"
#include <iostream>

Arguments::Arguments() : MnPtr() {}

void Arguments::SetMnPtr(Main* Ptr)
{
    std::cout << "[Arguments] Setting MnPtr to " << Ptr << std::endl;
    this->MnPtr = Ptr;
}

Main* Arguments::GetMnPtr() 
{
    return this->MnPtr;
}

void Arguments::parseArguments(char *arguments[],char *argumentsElements[])
{
    try {
        if (sizeof(arguments) == 1 || sizeof(arguments) > 4) throw 1;
    }
    catch (int errorCode) {
        if (errorCode == 1) std::cout << "Wrong usage!\n\nUsage: chek.exe <timeout-in-miliseconds> <log-file-path>\nExample: chek.exe 10000 saturday_log_file.txt\n";
    }
    std::cout << "Size -> " << sizeof(arguments) << std::endl;
    for(int i=0; i<sizeof(arguments); i++)
    {
        // The error is produced here,for some reason after MnPtr,// nothing is recognised. Like getCrPtr()... has never been declared?
        this->MnPtr->getCrPtr()->getBroadcast()->(1,"Works!");
    }
}

库/广播.h:

#pragma once
#include <iostream>
#include "Main.h"

class Broadcast
{
public:
    Broadcast();

private:
    Main* MnPtr;

public:
    void Log(unsigned int statusLevel,std::string message);
    void SetMnPtr(Main* Ptr);
};

库/广播.cpp:

#include "pch.h"
#include "Broadcast.h"
#include <iostream>
#include <string>

using namespace std;

Broadcast::Broadcast() : MnPtr() {}

void Broadcast::SetMnPtr(Main* Ptr)
{
    std::cout << "[Broadcast] Setting MnPtr to " << Ptr << std::endl;
    this->MnPtr = Ptr;
}

void Broadcast::Log(unsigned int statusLevel,string message) 
{
    switch (statusLevel) {
    case 1:
        cout << "[.] " << message;
        break;
    case 2:
        cout << "[+] " << message;
        break;
    case 3:
        cout << "[!] " << message;
        break;
    case 4:
        cout << "[X] " << message;
        break;
    }
}

错误: 我遇到3个错误。

Visual Studio错误(将其悬停时):

Arguments *const this

Pointers to incomplete class is not allowed.

从错误框中(Visual Studio):

Error   C2027   use of undefined type 'Main'    Chek2   c:\users\xxx\documents\programming\c++\vs workspace\chek2\arguments.cpp 30  
Error (active)  E0393   pointer to incomplete class type is not allowed Chek2   C:\Users\xxx\Documents\Programming\C++\VS Workspace\Chek2\Arguments.cpp 30  

编译器错误:

1>c:\users\xxx\documents\programming\c++\vs workspace\chek2\arguments.cpp(30): error C2027: use of undefined type 'Main'
1>c:\users\xxx\documents\programming\c++\vs workspace\chek2\arguments.h(3): note: see declaration of 'Main'

如果有人可以帮助我。我将不胜感激!我希望这个问题不太难-对于C ++来说是相当新的问题,所以我不知道这与Java相比到底是什么。

解决方法

感谢@drescherjm回答评论。我只需要添加:

#include "Main.h"
#include "Core.h"

Arguments.cpp里面!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-