首页 > 解决方案 > 解析指针并在类之间使用它们 [C++]

问题描述

所以我C++对它还很陌生,几周左右我才开始编写代码。我一直面临着一个我无法解决的问题。每次我学习一门新的编程语言时,我都会挑战自己制作一个小程序(不太复杂),它将我学到的关于该语言的所有内容(函数、类、数组、指针等)组合在一起,这样我就可以得到很好地了解该语言的实际编码情况。

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

我还在Lib/Arguments.cpp 中添加了一条评论,说明我的问题在哪里。 假设我要在Java. 我会像这样做我的结构:

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 lib都由 处理Core,例如...要调用这些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);
}

主要/主要.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

主要/主要.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);
}

核心/核心.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

核心/核心.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;
}

库/Arguments.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 相比究竟是什么。

标签: c++visual-studiopointersmethods

解决方案


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

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

里面Arguments.cpp的包括!


推荐阅读