无法编译应该从Bjarne stroustrup的编程原理和实践第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,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,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

解决方法

假设以下目录布局,请根据需要进行调整。还要假设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
  • 将{{1}中的#include <PPP2HEADERS/Simple_window.h>替换为#include <Simple_window.h>test4.cpp替换为#include <PPP2HEADERS/Graph.h>

  • 在当前目录设置为#include <Graph.h>的情况下,打开VS 2019的 x86本机工具命令提示符cmd /k vcvars32.bat)。

  • 使用X:\ppp2code进行编译,以避免/W3触发的警告(大多是无害的)。

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

    X:\ppp2code\test4>cl.exe /c /nologo /W3 /D "WIN32" /MD /EHsc /O2 /I "..\gui" /I "..\fltk" test4.cpp ..\gui\*.cpp
    
  • 运行生成的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