【问题标题】:Parsing Pointers & Using them between classes [C++]解析指针并在类之间使用它们 [C++]
【发布时间】:2020-08-18 02:50:12
【问题描述】:

所以我对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 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);
}

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

Lib/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();
};

Lib/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!");
    }
}

Lib/Broadcast.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);
};

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

【问题讨论】:

  • “不起作用”是什么意思?您是否收到编译器错误?
  • 创建Minimal Reproducible Example 会有所帮助。同时发布您遇到的错误消息(或现象)。
  • 我编辑了帖子,在底部添加了错误。对不起。
  • 在arguments.cpp 中你需要包含Main.h
  • 是的 arguments.cpp 就在您的 #include "Main.h" 下方

标签: c++ visual-studio pointers methods


【解决方案1】:

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

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

在Arguments.cpp 内包含!

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2021-11-13
相关资源
最近更新 更多