无法编译应该从 Bjarne stroustrup 的编程原理和实践的第 12 章工作的图形代码

Posted

技术标签:

【中文标题】无法编译应该从 Bjarne stroustrup 的编程原理和实践的第 12 章工作的图形代码【英文标题】:Can not compile graphics code that should work from chapter 12 of Bjarne stroustrup's Programming Principles and practice 【发布时间】:2020-10-23 23:50:12 【问题描述】:

你好堆栈溢出的成员!我希望曾经去过我所在的地方的人可以为我指明正确的方向。

我目前正在学习 C++ 并进行第 12 章中的图形练习,但我似乎无法获得应该可以工作的代码。 几天来,我一直在尝试让任何代码正常工作,并且已经克服了一些大问题,但是由于我只学习 C++,所以我目前处于我的专业知识的极限,并且已经用尽了以前在各种论坛上提出的所有问题解决了我遇到的许多其他问题。

这是简单的图形代码,下面是我收到的大量错误消息:

//
// This is example code from Chapter 12.3 "A first example" of
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//

#include <PPP2HEADERS/Simple_window.h>// get access to our window library
#include <PPP2HEADERS/Graph.h>// get access to our graphics library facilities

//------------------------------------------------------------------------------

int main()

    using namespace Graph_lib;   // our graphics facilities are in Graph_lib

    Point tl(100, 100);           // to become top left  corner of window

    Simple_window win(tl, 600, 400, "Canvas");    // make a simple window

    Graph_lib::Polygon poly;                // make a shape (a polygon)

    poly.add(Point(300, 200));    // add a point
    poly.add(Point(350, 100));    // add another point
    poly.add(Point(400, 200));    // add a third point 

    poly.set_color(Color::red);  // adjust properties of poly

    win.attach(poly);           // connect poly to the window

    win.wait_for_button();       // give control to the display engine


//------------------------------------------------------------------------------

尝试编译时收到的错误消息:

1>------ Build started: Project: test2, Configuration: Debug Win32 ------
1>test4.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(45,10): warning C4305: 'initializing': truncation from 'Graph_lib::Color::Transparency' to 'char'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(45,46): warning C4309: 'initializing': truncation of constant value
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(47,10): warning C4305: 'initializing': truncation from 'Graph_lib::Color::Transparency' to 'char'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(47,39): warning C4309: 'initializing': truncation of constant value
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\GUI.h(107,39): warning C4018: '<': signed/unsigned mismatch
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(16,23): error C2440: 'initializing': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(16,23): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(22,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(22,28): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(23,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(23,28): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(24,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(24,28): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>Done building project "test2.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我很确定 FLTK 安装正确,因为本书的附录 D 中有一个示例代码可以编译,并且我还使用了 here 中提到的更新的标头。

在这一点上,我已经尝试让图形代码工作好几天了,我想知道学习这本书的图形部分是否绝对必要。

如果我违反任何规则,任何人都可以提供任何帮助,我们将不胜感激并道歉,这是我第一次在堆栈溢出中发帖。

谢谢。

Point.H 按要求:

//
// This is a GUI support code to the chapters 12-16 of the book
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//

#ifndef POINT_GUARD
#define POINT_GUARD

namespace Graph_lib 
//------------------------------------------------------------------------------

struct Point 
    int x, y;
;

//------------------------------------------------------------------------------

inline bool operator==(Point a, Point b)  return a.x==b.x && a.y==b.y;  

//------------------------------------------------------------------------------

inline bool operator!=(Point a, Point b)  return !(a==b); 

//------------------------------------------------------------------------------


#endif // POINT_GUARD

【问题讨论】:

请编辑您的帖子以显示chapter12_graphics_example\test2\test4.cpp 的准确完整内容。您发布的代码与您发布的错误消息不匹配。还请在您的头文件之一中发布Point 的类声明,以便我们查看它具有哪些构造函数。请注意,您收到的一些“警告”可能是因为代码是很久以前编写的,但需要修复“错误”才能构建此程序。 @JohnZwinck 我的完整代码已显示,唯一的变化包括顶部的附加 cmets。 Point.H 也已发布。谢谢你的帮助。 【参考方案1】:

假设以下目录布局,根据需要进行调整。还假设fltk\lib 中的 FLTK 库已经成功构建,例如Install-FLTK-for-use-with-Visual-C.

X:\ppp2code
├─fltk     <--  FLTK root directory, based on fltk-1.3.5-source
│ ├─FL     <--       include directory
│ └─lib    <--       lib directory, with the prebuilt libraries
├─gui      <--  PPP2 GUI (simple_window etc), based on stroustrup.com/programming_support.html 
└─test4    <--  OP's test code

test4.cpp 中的#include &lt;PPP2HEADERS/Simple_window.h&gt; 替换为#include &lt;Simple_window.h&gt;,同样将#include &lt;PPP2HEADERS/Graph.h&gt; 替换为#include &lt;Graph.h&gt;

打开 x86 Native Tools Command Prompt for VS 2019 (cmd /k vcvars32.bat),当前目录设置为 X:\ppp2code

使用/W3 编译以避免/W4 触发的(大部分无害的)警告。

X:\ppp2code\test4>cl.exe /c /nologo /W3 /D "WIN32" /MD /EHsc /O2 /I "..\gui" /I "..\fltk" test4.cpp ..\gui\*.cpp

与支持的 PPP2 对象和预构建的 FLTK 库链接。

X:\ppp2code\test4>link /nologo /LIBPATH:"..\fltk\lib" /SUBSYSTEM:WINDOWS /OUT:"test4.exe" test4.obj graph.obj gui.obj simple_window.obj window.obj fltk.lib fltkimages.lib fltkjpeg.lib user32.lib gdi32.lib shell32.lib advapi32.lib ole32.lib

运行生成的test4.exe

【讨论】:

您好 dxiv,感谢您的帮助,对回复缓慢表示歉意。不幸的是,我不完全确定你想让我在这里做什么。您的意思是让我将 fltk 根目录文件和 GUI 文件复制到项目文件夹中,在本例中为 test2?再次感谢您的帮助 @Dara "根据需要调整" 表示将两个命令行中的 ..\fltk..\gui 引用更改为您使用的路径。您不需要更改或复制任何其他内容。

以上是关于无法编译应该从 Bjarne stroustrup 的编程原理和实践的第 12 章工作的图形代码的主要内容,如果未能解决你的问题,请参考以下文章

代码在 Visual c++ 中无法按预期工作(来自 bjarne stroustrup 编程和原则书 2n 版的示例)

Bjarne Stroustrup 语录1

由于在 Bjarne Stroustrup“使用 c++ 的编程和实践”中找不到符号而导致的链接错误

模板 :: Stroustrup 的示例未编译

C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费

C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费